Je suis arrivé sur ces valeurs dans mon code ColdFusion, mais le calculateur Google semble avoir le même "bogue" où la différence est non nulle. P>
416582.2850 - 411476.8100 - 5105.475 = -2.36468622461E-011 P>
Javacast'ing ceux-ci à long / flotteur / double ne vous aide pas, il en résulte d'autres différences non nulles. P>
7 Réponses :
inexactitudes à virgule flottante (il existe un nombre infini de nombres réels et seulement un nombre fini de nombres de 32 ou 64 bits pour les représenter). P>
Si vous ne pouvez pas gérer de minuscules erreurs, vous devez utiliser bigdecimal code>
à la place. p>
Mais 416582.2850 - 411476.8100 peut être représenté exactement i> 5105.475. Ce sont des chiffres avec seulement 4 décimales, ne pas répéter. Est-ce que 4 décimales sont trop précises?
Ce n'est pas la représentation de base-10 qui doit être fini, c'est la représentation de base-2. Voir en.wikipedia.org/wiki/binary_numeral_bin Ary pour une explication de Quelles fractions peuvent être représentées exactement en binaire (ce n'est que ceux qui ont 2 en tant que facteur premier du dénominateur).
@Brian: Ce n'est pas le nombre de décimales. La fraction 1/3 ne peut pas être représentée dans la base 10, non? Ce serait 3.3333333 répéter. Il en va de même pour les décimales (ou les fractions) en binaire (base 2). 1.1, bien que valable dans la base 10, ne peut pas être représenté avec précision dans la base 2 et entraîne ainsi ce que vous pouviez appeler une "erreur d'arrondi".
Ceci est parce que les nombres décimaux qui "regardent" dans la base 10, ne sont pas exactement représentables dans la base 2 (ce que les ordinateurs utilisent pour représenter des nombres de points flottants). Veuillez consulter l'article ce que chaque scientifique informatique devrait connaître sur l'arithmétique de points flottants Pour une explication détaillée de ce problème et de contvences. p>
5105.475 était le nombre qui n'était pas représentable exactement dans un double. La précisionvaluate est la fonction de coldfusion dont j'avais besoin.
En réalité, aucun de ces chiffres n'est exactement représentable en tant que valeurs de double précision.
+1 Excellente référence, consultez également «Comment imprimer des nombres de points flottants avec précision» par G.L. Steele
Je lis ce paragraphe ce matin, je jure: "Si je pouvais revenir dans le temps et changer une chose, je pourrais essayer d'intéresser des personnes préparates précoces à ne pas utiliser leurs pouces quand elles comptent. Cela aurait pu être la norme, et elle aurait fait beaucoup de choses plus faciles dans l'ère moderne. D'autre part, nous avons beaucoup appris de la lutte avec l'incompatibilité de la base-dix avec des pouvoirs de deux. " -Guy Steele, codeurs au travail
Bien que la base 8 pourrait être pratique pour les ordinateurs, je suggère que si nous avions tous six doigts sur chaque main (base 12), notre système de numéros aurait été mieux dans l'ensemble. 12 a plus de petits facteurs que 10.
Le problème est la représentation inexacte des types de points flottants. Parce que celles-ci ne peuvent pas être exactement représentées comme des flotteurs, vous obtenez une perte de précision qui entraîne des opérations de petites erreurs. Typiquement, avec des flotteurs, vous souhaitez comparer si le résultat est égal à une autre valeur dans une petite épislon (facteur d'erreur). P>
Étant donné que les numéros de stockage d'ordinateurs dans des numéros de flotteurs binaires sont imprécis. 1E-11 est une infime différence en raison de l'arrondissement de ces nombres décimaux au nombre binaire représentable le plus proche. P>
Ce "bogue" n'est pas un bug. C'est comme ça que les œuvres arithmétiques ponctuelles flottantes. Voir: http://docs.sun.com/source/806-3568/ ncg_goldberg.html
Si vous voulez une précision arbitraire en Java, utilisez bigdecimal code>: p>
Ce sont des problèmes de points flottants et utilisant Modification de l'ordre de la soustraction donne également zéro dans Google. p> bigdecimal code> va le corriger.
Utiliser contrairement à precisionevaluate () code> dans ColdFusion (il utilisera
bigdecimal code> dans java)
Evaulement () code>, non "" est nécessaire. p> p>
Il devrait y avoir un quiz de point flottant lors de la création d'un compte. Je pense que c'est la question la plus souvent posée sur le site.
@Recursive: meta.stackexchange.com/questions/26621/...
Lorsque j'ai appris à programmer, le manque de précision dans les numéros de points flottants a été mentionné que le premier point flottant a été discuté et plusieurs fois par la suite. Ne le font-ils pas plus?
Heh, même bug dans Haskell et son généralement assez bon à ces choses: prélude> 416582.2850 - 411476.8100 - 5105.475 -2.3646862246096134E-11
-2.36468622461E-011? Dans mon quartier, il répond à "zéro".
Je me souviens que lorsque l'un de nos développeurs juniors a été déclenché par une précision de point flottante pour la première fois. renifle i> Ils grandissent si vite!