2010-09-16 16 views
3

J'essaie d'obtenir le nombre de chiffres dans la double valeur suivante: 56.46855976 sans utiliser convertissant en une chaîne (et en remplaçant simplement le "." Avec un "").Comment pouvez-vous obtenir le nombre de chiffres contenus dans un double?

Quelqu'un a-t-il des idées?

+0

Zut Aww, ce qui ne va pas avec: 'deux d = 56,46855976; int length = d.ToString(). Replace (".", "") .Length; ' – slugster

+4

Prenez également en compte que le nombre que vous voyez (56.46855976) est seulement une * représentation * d'une valeur. La valeur 1/3 est très courte, le nombre 0.33333 ... ne l'est pas. Donc, sauf pour les problèmes d'affichage, il n'y a pas beaucoup d'informations dans la longueur d'un nombre. –

+0

Copie possible de [C# Decimal to string pour devise] (https://stackoverflow.com/questions/10437416/c-sharp-decimal-to-string-for-currency) – TylerH

Répondre

0

La conversion en chaîne est peut-être la meilleure option. Rappelez-vous que double sont représentés en Base 2 en interne. Par conséquent, la représentation décimale que vous voyez est seulement une approximation de la valeur réellement stockée (excepté pour les entiers jusqu'à 2) qui est une somme de puissances individuelles de 2.

Essayant de trouver le nombre de chiffres décimaux de la représentation binaire n'est certainement pas une tâche facile ou triviale - d'autant plus que le framework pourrait aussi s'appliquer à arrondir pour faire apparaître des nombres comme 3.999999999998 comme 4.0 puisqu'ils semblent avoir plus de précision qu'il n'y en a en réalité.

5

Comptez combien de fois vous devez diviser le nombre par 10 jusqu'à ce qu'il soit inférieur à 1 -> qui vous donne les chiffres avant la virgule.

Ensuite, comptez combien de fois vous devez multiplier le nombre original par 10 jusqu'à ce qu'il soit égal au résultat Math.Floor -> qui vous donne les chiffres derrière les points décimaux.

Add. Soit heureux.

Editer: Comme le souligne Joey, il y a une certaine incertitude. Définissez un nombre maximum de chiffres avant de ne pas créer une boucle infinie. D'autre part - « Combien de temps est la côte du Danemark? » ...

1
/// Returns how many digits there are to the left of the . 
    public static int CountDigits(double num) { 
     int digits = 0; 
     while (num >= 1) { 
      digits++; 
      num /= 10; 
     } 
     return digits; 
    } 

Comme Martin a mentionné, en comptant à droite de la. est inutile.

Tests:

MathPlus.CountDigits(56.46855976)     -> 2 
MathPlus.CountDigits((double)long.MaxValue + 1) -> 19 
MathPlus.CountDigits(double.MaxValue)    -> 309