2010-06-01 12 views
1

Doublons possibles:
Why does 99.99/100 = 0.9998999999999999
Dealing with accuracy problems in floating-point numbers0,699 x 100 = 69,89999999999999?

Je l'ai vu cette question en php et javascript. J'ai ce numéro: float 0.699

si je fais ceci: 0,699 x 100 = 69,89999999999999

pourquoi?

modifier

round(0.699 x 10, 2): flotter 69,90000000000001

+0

Voir aussi http://stackoverflow.com/questions/590822/dealing-with-accuracy-problems-in-floating-point-numbers/590851#590851 – Pops

+0

@Chris, FYI, la question que vous liez à est , lui-même, un dupe – Pops

+0

@Lord - Désolé, je vérifie habituellement. – ChrisF

Répondre

10

arithmétique en virgule flottante n'est pas exact. Voir Floating point on Wikipedia pour une discussion plus approfondie du problème.

+0

1,0 + 1,0 = 3 pour un très grand nombre de 1 –

+2

1 + 1 = 3. Si vous mettez la décimale 0, le 1 ne peut pas être un grand nombre. – Samuel

+0

Je ne comprends pas :( –

1

Les nombres Javascript sont en virgule flottante.

Jetez un oeil à The complete javascript number reference. Extrait:

Tous les nombres en JavaScript sont 64 bits (8 octets) nombres à virgule flottante qui donne une portée effective de 5E-324 (négative) à 1.7976931348623157e + 308 (positive) au moment de cet article, a été écrit (cela peut éventuellement changer à 128 bits dans le futur comme 64 processeurs de bits se banalisent et les normes ECMA évoluent).

Entiers sont considérés comme fiables (numéros sans période ou notation exposant ) à 15 chiffres (9e15) 1. Les nombres à virgule flottante sont considérés comme seulement aussi fiable que possible et non de plus! C'est un concept particulièrement important à comprendre pour la manipulation de la devise comme 0.06 + 0.01 résolution à 0.06999999999999999 au lieu de 0.07.

2

Cela se produira dans n'importe quelle langue. Flotteurs, comme tout le reste sur un ordinateur, sont stockés en tant que binaire. Le nombre 0.699, bien que représentable exactement en décimal, est probablement un nombre décimal répétitif en binaire, donc il ne peut pas être stocké avec une précision exacte.

Consultez le wikipedia entry pour savoir comment les flotteurs sont stockés et pourquoi cela se produit.

5

C'est ce qui m'a aidé dans le passé. Cela a beaucoup à voir avec la façon dont les choses sont représentées en binaire. Fondamentalement longue histoire courte en binaire il n'y a pas un nombre exact pour tous les nombres réels de grands nombres.

Le lien ci-dessous vous le décrira plus en détail.

What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

FTA: Serrant infiniment beaucoup de nombres réels dans un nombre fini de bits exige une représentation approximative – Sirber

+0

Oui mais comme ils expliquent plus tard essayant de montrer 0.1 en binaire n'est pas facile surtout quand vous êtes contraint à une certaine quantité d'espace .1^10 est représenté .00011001100110011001100110011001^2 qui est en fait .09 ...... quelques autres choses. – Elliott

0

Jetez un oeil à Floating Point, en particulier la section IEEE 754 et les numéros représentables.

0

Ce comportement peut être reproduit dans de nombreux langages de programmation, notamment C++ et Assembly. La raison en est le format à virgule flottante en utilisant par FPU. Vous pouvez lire les détails ici:

http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_14/CH14-1.html#HEADING1-19

Règle générale: ne jamais attendre résultat exact des opérations à virgule flottante. Ne comparez jamais deux nombres à virgule flottante, utilisez interval, par exemple: au lieu de tester f1 == f2, utilisez f1> (f2 -e) et f1 < (f2 + e), e est une petite valeur.