2009-08-18 3 views
1

これは私には非常に奇妙です:最後にルビーで、なぜ "100.7" .to_f.modulo(1)= 0.700000000000003?

irb(main):012:0> "100.7".to_f.modulo(1) 
=> 0.700000000000003 

なぜ3?

irb(main):019:0> "10.7".to_f.modulo(1) 
=> 0.699999999999999 

ここで同じことは...この値の残りを1で割ったものにすぎません。それは正確でなければなりません。

+2

ほとんどすべての '[浮動小数点]'質問が重複しています。たとえば、http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binaryを参照してください。 –

+2

これはruby-talkメーリングリストや実際に存在していたプログラミング言語のディスカッションフォーラムでも約100スレッドの複製です。 –

答えて

0

これは、すべての浮動小数点数を正確に表すことができないためです。

3

これは一般的な浮動小数点の丸めです。 Floatの固定されたビット数のすべての10進数を単純に表現することはできないため、いくつかの値は表現可能な最も近い値に丸められます。

このため、浮動小数点数が等しいかどうか比較することはお勧めしません。より小さいか大きいかを比較しますが、等しくないことはありません。

http://en.wikipedia.org/wiki/Floating_point#Representable_numbers.2C_conversion_and_rounding

単純に、それは「それは正確でなければならない」という場合ではありません。浮動小数点小数点から期待しないでください。

2

が浮動小数点演算へようこそです。標準的な浮動小数点表記法では表現できない数が多く、ちょっとだけ出てきます。

これは、以下のように簡単に説明する:

(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 

注意桁を超えて精度数が取得大きく、低いこと。これは、番号全体を表すのに使用できる精度が固定されているためです。

関連する問題