2010-05-28 18 views
0

Possible en double:
Dealing with accuracy problems in floating-point numbersPourquoi est-ce 99,99/100 = 0,9998999999999999

Alors que 99,99 * 0,01 = 0,99

Il est clair que cela est l'âge vieux problème arrondi à virgule flottante, mais l'erreur d'arrondi dans ce cas me semble assez grande; ce que je veux dire, c'est que je m'attendais à un résultat de 0,99990000001 ou à un résultat similaire.

Et pour mémoire, j'ai eu la même réponse dans un environnement JavaVM et .Net.

+0

Cela a été demandé à plusieurs reprises avant, ici - http://stackoverflow.com/questions/590822/dealing-with-accuracy-problems-in-floating-point-numbers - est juste un exemple – ChrisF

+4

différence entre cette réponse et 0,99990000001 est le même. vous l'avez compris, n'est-ce pas? – SilentGhost

+0

Et il * est * proche comme vous l'attendiez. –

Répondre

5

Pourquoi 0.9998999999999999 n'est pas assez proche pour vous (et 0.9999000000000001 est bon)?
abs (0,9999 - 0,9998999999999999) == abs (0,9999 - 0,9999000000000001)

+0

Ahh oui, 0,999 * 8 * Bien repéré. – redcalx

2

Il s'agit d'une erreur en virgule flottante. Pour (beaucoup) plus de détails, voir wikipedia article. Utilisez un decimal si vous avez besoin de résultats fractionnaires précis (voir here).

+1

Ou, plus précisément, utilisez un 'decimal' si vous faites des calculs où la ** représentation décimale ** du résultat est importante. –

+1

Daniel a raison: la représentation décimale n'est pas beaucoup plus précise que binaire. Il correspond cependant à l'arithmétique que nous utilisons habituellement, donc lorsque des correspondances exactes avec des processus existants sont nécessaires (comme dans beaucoup de travail financier), utilisez la méthode décimale. –