これに遭遇したばかりで、Ruby がこのように動作する理由が正確にわかりません。
誰かがRubyで理由を説明できますか:
6.84 - 3.6 == 3.2399999999999998
3.24だけではありませんか?私はそれがそれらの数のバイナリ表現に関連していることを知っています。
(Decimal('6.84') - Decimal('3.6'))
期待される結果を返します。Float 動作の詳細な説明に興味があります。
これに遭遇したばかりで、Ruby がこのように動作する理由が正確にわかりません。
誰かがRubyで理由を説明できますか:
6.84 - 3.6 == 3.2399999999999998
3.24だけではありませんか?私はそれがそれらの数のバイナリ表現に関連していることを知っています。
(Decimal('6.84') - Decimal('3.6'))
期待される結果を返します。Float 動作の詳細な説明に興味があります。
浮動小数点演算については、" Why is the 100*0.07 equal to 6.9999....? " (および他の多くの場所)の回答を参照してください。
double/float は base-2 表記と decimal base-10 表記を使用するためです。
便利なリンクは次のとおりです。http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
2 進浮動小数点の問題です。
これを読む
ほとんどの場合、Float/Double はそれほど正確ではありません (float は base2 で数値を補間するため)。浮動小数点演算の結果は、CPU によって異なる場合があります。.01 に近い領域は、.99 に近い領域よりも正確です。
float 演算で計算された値を比較する必要がある場合は、丸め誤差を消去するためにイプシロン値 (非常に小さい値) を使用します。
擬似コード:
boolean equals(float x, float y) {
float result = x - y;
if(result*result < epsilon)
return true;
else
false;
}
基数表記-2 および 10 進基数は double と float で使用されます
0.01 または 0.07 は、2 進浮動小数点では正確に表すことができません。
浮動小数点は、本質的に不正確な内部表現を使用します。表示のために、常に回答を切り捨てる必要があります。
'%.4f' % (6.84 - 3.6)
# => "3.2400"
独自のデバイスに任せれば、Ruby は他の多くの言語と同様に、浮動小数点数を途方もない精度で表現します。