2009-08-18 25 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 

同樣的事情在這裏...我們只得到這個值的其餘部分除以一。它應該是確切的。

+2

重複幾乎所有的[浮點]問題。例如,請參閱http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary。 – 2009-08-18 21:14:26

+2

這也是ruby-talk郵件列表中約100個線程的副本,或者任何曾經存在的任何編程語言的討論論壇。 – 2009-08-18 23:50:01

回答

0

,這是因爲它不可能準確地表示所有的浮點數。

3

這是典型的浮點舍入。你根本無法表達對固定數量的浮動位的每一個十進制數,所以一些數值四捨五入到可以表示最接近的值。

由於這個原因,我們建議您不要爲相等比較浮標。比較小於或大於,但從來沒有確切的相等。

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 

注意,數字變大,下部的精度超出小數位。這是因爲有一個固定的精度可用來表示整個數字。