2017-10-04 10 views
2

J'ai le code suivant:Débogueur arrondit les nombres flottants ... pourquoi cela se produit-il, et comment le contourner?

public static float FLOAT_VALUE = 0.899999761581421f; 

Mais chaque fois que j'appelle cette valeur en utilisant le débogueur, je vois qu'il est maintenant devenu 0.9f. Pourquoi cela se passe-t-il et comment le contourner?

+2

https://stackoverflow.com/questions/588004/is-floating-point-math-broken – epascarello

+2

'float' a [6 à 9 chiffres décimaux significatifs précision] (https://en.wikipedia.org/wiki/Single-precision_floating-point_format#IEEE_754_single-precision_binary_floating-point_format:_binary32). Vous spécifiez 15 chiffres de précision. 'float' ne peut pas stocker cela, mais' double' peut, puisqu'il a [15 à 17 précision décimale significative] (https://en.wikipedia.org/wiki/Double-precision_floating-point_format#IEEE_754_double-precision_binary_floating- point_format: _binary64). – Andreas

+0

Le débogueur arrondit à moins de chiffres qu'il ne le devrait. Le flottant le plus proche de 0,899999761581421 est 0,89999973773956298828125. Le flottant le plus proche de 0.9 est 0.89999997615814208984375. Ils sont différents. La conversion de toString de votre flotteur est 0.89999974, pas 0.9 –

Répondre

3

La valeur change réellement ou, plus probablement, le débogueur ne parvient pas à afficher suffisamment de chiffres pour distinguer les flottants distincts. Le flottant le plus proche de 0.899999761581421 est 0.89999973773956298828125. Le flottant le plus proche de 0.9 est 0.89999997615814208984375. Ils sont différents.

La conversion toString de ,89999973773956298828125 est 0,89999974, pas 0,9