最近、私はいくつかの言語でバグ/機能に出くわしました。私はそれがどのように引き起こされるかについて非常に基本的な知識を持っています(そして私はいくつかの詳細な説明が欲しいです)、しかし私が何年にもわたって作ったに違いないすべてのバグを考えるとき、問題はどうやって私が「ねえ、これは引き起こすかもしれないばかげたバグです。任意精度関数を使用したほうがいいです」、他の言語にはこのバグがあります(そして、そうでない言語、理由)。また、なぜ0.1 + 0.7がこれを行うのか、つまり0.1 + 0.3が行わないのか、他によく知られている例はありますか?
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
ルビー:
>> ((0.1+0.7)*10).to_i
=> 7
>>((0.1+0.7)*10)
=> 7.999999999999999