2009-02-25 9 views
2

Comment obtenir la longueur de la fraction? Si possible, sans utiliser l'opération de chaîne ou boucleLongueur de la fraction

should all return length of 3: 
5.234 
5.23400 
5.234000 

Toute langue de programmation est acceptée

[EDIT]

Pas de devoirs, je veux afficher des fractions à son minimum. Exemple, j'ai défini numeric (18,8) dans la base de données. Si l'utilisateur a entré seulement 5.234, les données enregistrées dans la base de données sont 5.23400000. Je veux juste pour l'afficher en arrière comme 5,234 seulement

+0

Est-ce que c'est ce devoir? –

Répondre

2
If Int(num) = num Then Return 0 
num *= 10 
If Int(num) = num Then Return 1 
num *= 10 
If Int(num) = num Then Return 2 
num *= 10 
If Int(num) = num Then Return 3 
num *= 10 
If Int(num) = num Then Return 4 
num *= 10 
If Int(num) = num Then Return 5 
num *= 10 
If Int(num) = num Then Return 6 
num *= 10 
If Int(num) = num Then Return 7 
num *= 10 
If Int(num) = num Then Return 8 
Throw New Exception("Number exceeds expected precision") 

Aucune opération de chaîne, aucune boucle.

EDIT:

BTW, de le faire avec une boucle:

result = 0 
Do While (Int(num) !> num) 
    num *= 10 
    result += 1 
Loop 
Return result 

Un peu plus élégant

+0

Celui-ci est bon. Je suis sur le point de m'appuyer sur la division répétée (j'abandonne l'idée de la boucle) et de compter jusqu'à 0, mais je ne peux pas le faire puisque la fraction est ce que je suis après, pas le nombre entier. C'est une bonne logique! – Hao

0

Pour la partie non-fraction, la longueur est:

int((ln(v)/ln(10))+.999) 

aussi longtemps que v> 1 où ln() est le logarithme naturel et int() arrondit toujours vers le bas. Pour v == 1, ln (v) renvoie 0, donc vous devez gérer cela dans un cas particulier.

Il devrait être possible d'obtenir la même chose pour la partie fraction (v - int(v)) mais mes maths me manquent.

+0

Je doute que tout ce qui a trait au journal naturel puisse être utile. Parce que String.format ("% x", Double.doubleToRawLongBits (5.234)) donne 4014ef9db22d0e56 et cela, en préservant tous les chiffres, évalue à 5.2339999999999999857891452847979962825775146484375 alors que 5.25 peut être représenté exactement. 5.251 est à nouveau approchée par 5.25100000000000033395508580724708735942840576171875. Mon point étant la longueur n'est pas monotone dans le cas de fraction. –

0

Implémentez simplement l'algorithme de division. Et vous arrêtez lorsque le nombre compte> 7 ou 8 chiffres (pour float32)

3

Étant donné que vous êtes préoccupé par l'affichage et non la représentation interne, pourquoi ne pas simplement supprimer les 0 de fin?

#!/use/bin/perl 

my @nums = ('5.234', '5.23400', '5.234000'); 
$_ =~ s/0+$// for @nums; # remove trailing 0s 
$_ =~ s/\.$// for @nums; # remove trailing . 

print "@nums\n"; 

Vous pouvez probablement optimiser les deux dans une même expression régulière.

+0

En fait, 5.234 ne peut PAS être représenté dans l'entier 64 bits de l'IEEE 745, il serait en fait approché de 5.23399999999999985789145284797996282577514648437500 ;-) –

0

Lors de l'utilisation de Java et JDBC, obtenez la valeur via ResultSet.getBigDecimal(). Pour obtenir la bonne échelle, utilisez ce code (Java 5 et plus, il y a un bogue dans Java 1.4 qui fait échouer pour « 0.0 »):

int precision = v.stripTrailingZeros().scale(); 

Pour Java 1.4, voir this page.

0

En Java:

Double.valueOf("5.34000").toString(); 

Je suppose, vous pouvez vouloir convertir la chaîne en double de toute façon.

Questions connexes