が浮動小数点演算へようこそです。標準的な浮動小数点表記法では表現できない数が多く、ちょっとだけ出てきます。
これは、以下のように簡単に説明する:
(1..10).collect do |i|
v = ((10**i).to_f + 0.7)
puts "%13.1f = %.30f" % [ v, v.modulo(1) ]
end
結果である場合:
10.7 = 0.699999999999999289457264239900
100.7 = 0.700000000000002842170943040401
1000.7 = 0.700000000000045474735088646412
10000.7 = 0.700000000000727595761418342590
100000.7 = 0.699999999997089616954326629639
1000000.7 = 0.699999999953433871269226074219
10000000.7 = 0.699999999254941940307617187500
100000000.7 = 0.700000002980232238769531250000
1000000000.7 = 0.700000047683715820312500000000
10000000000.7 = 0.700000762939453125000000000000
注意桁を超えて精度数が取得大きく、低いこと。これは、番号全体を表すのに使用できる精度が固定されているためです。
ほとんどすべての '[浮動小数点]'質問が重複しています。たとえば、http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binaryを参照してください。 –
これはruby-talkメーリングリストや実際に存在していたプログラミング言語のディスカッションフォーラムでも約100スレッドの複製です。 –