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