14 Stimmen

int((0.1+0.7)*10) = 7 in mehreren Sprachen. Wie lässt sich dies verhindern?

Kürzlich stieß ich auf einen Fehler bzw. eine Funktion in mehreren Sprachen. Ich habe ein sehr grundlegendes Wissen darüber, wie er verursacht wird (und ich hätte gerne eine detaillierte Erklärung), aber wenn ich an all die Fehler denke, die ich im Laufe der Jahre gemacht haben muss, ist die Frage, wie ich feststellen kann, " Hey, das könnte einen lächerlichen Fehler verursachen, ich würde besser beliebige Präzisionsfunktionen verwenden ", welche anderen Sprachen diesen Fehler haben (und welche nicht, warum ). Warum ist das bei 0,1+0,7 der Fall und bei 0,1+0,3 nicht, gibt es andere bekannte Beispiele?

PHP

//the first one actually doesn't make any sense to me,
//why 7 after typecast if it's represented internally as 8?
debug_zval_dump((0.1+0.7)*10); //double(8) refcount(1)
debug_zval_dump((int)((0.1+0.7)*10)); //long(7) refcount(1)
debug_zval_dump((float)((0.1+0.7)*10)); //double(8) refcount(1)

Python:

>>> ((0.1+0.7)*10)
7.9999999999999991
>>> int((0.1+0.7)*10)
7

Javascript:

alert((0.1+0.7)*10); //7.999999999999999
alert(parseInt((0.7+0.1)*10)); //7

Rubin:

>> ((0.1+0.7)*10).to_i                                                  
=> 7                                                                    
>>((0.1+0.7)*10)                                                       
=> 7.999999999999999

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X