2014-09-20 1 views
0

Je vois cela dans JavaScriptJavaScript problème mathématique

2-(1/3 * 1) // => Returns 1.66666666667 

mais,

4-(1/3 * 7) // => Returns 1.6666666667 

C'est une moins 6 que le résultat précédent. Ceci est une erreur, car les deux expressions sont supposées égales à 5/3

J'ai essayé de faire la même chose en utilisant Python, et les deux expressions ont retourné le même résultat.

+0

C'est exactement la précision arbitraire que votre IDE décide de rapporter. Si vous souhaitez rapporter à une précision spécifique, spécifiez-le manuellement. – CoryKramer

+4

Oui. Quelle est ta question? Si vous comptez sur un nombre spécifique de six dans le résultat, vous êtes sur un terrain très fragile. – Borodin

+0

S'il vous plaît, quelqu'un connaît-il la ressource * à virgule flottante * habituelle à laquelle lier? – Borodin

Répondre

1

En effet, les intermédiaires sont un ordre de grandeur différent:

0.3333333333333333 * 1 
#>>> 0.3333333333333333 

0.3333333333333333 * 7 
#>>> 2.333333333333333 

Cela signifie que le premier sera arrondi à une 8x plus grande granularité que la seconde. En raison de repr Python être joli et arrondi à la décimale la plus proche qui évalue exactement au point flottant, cela se manifeste par une différence de 10x dans la granularité.

Pour comparer visuellement:

0.3333333333333333 
2.333333333333333 

Voyez comment ils ont le même nombre de chiffres significatifs, mais un nombre différent de décimales. Lorsque vous faites number - multiplication, vous finissez par "décomposer" cette valeur, donc elle se termine avec plus d'erreur qu'avant en termes relatifs, bien que l'erreur exacte (absolue) soit la même.

Questions connexes