2

私は Ruby を初めて使用するので、最初に無知をお詫びします :) 顧客のアカウントを合計するときに問題が見つかりました。一部の金額は小数点以下の桁数がマイナスであり、これが合計を台無しにしています。ここにいくつかの簡単なコード例があります...

testnum = 0.00
puts "###Debug### testnum = #{testnum} (after  0.00)"
testnum += 5.00
puts "###Debug### testnum = #{testnum} (after  5.00)"
testnum += 3.33
puts "###Debug### testnum = #{testnum} (after  3.33)"
testnum += -1.00
puts "###Debug### testnum = #{testnum} (after -1.00)"
testnum += -2.22
puts "###Debug### testnum = #{testnum} (after -2.22)"

結果と...

###Debug### testnum = 0.0 (after  0.00)
###Debug### testnum = 5.0 (after  5.00)
###Debug### testnum = 8.33 (after  3.33)
###Debug### testnum = 7.33 (after -1.00)
###Debug### testnum = 5.109999999999999 (after -2.22)

したがって、-2.22 を追加すると testnum が破損しますが、-1.00 を追加しても問題ありませんでした。何が間違っているのかわかりません。

4

2 に答える 2

2

http://floating-point-gui.de/basic/から

0.1 + 0.2 などの数値を足して 0.3 にならず、代わりに 0.30000000000000004 のような奇妙な結果が得られるのはなぜですか?

内部的に、コンピューターは 0.1、0.2、0.3 などの数値を正確に表すことができない形式 (2 進浮動小数点) を使用しているためです。

特にお金を扱う場合に、結果を正確に合計する必要がある場合は、特別な decimal データ型を使用します。

Ruby では、これはBigDecimalです。

于 2012-11-08T11:05:14.453 に答える
1

パニック大佐は推論について正しいので、同じことを繰り返したくありません。さらに、ラウンド関数を使用できます。例:

1.9.3p194 :001 > 5.109999999999999.round(2)
 => 5.11 

最大 2 桁の deciaml しか使用していないため、これは役立つはずです。

于 2012-11-08T14:47:40.740 に答える