這是很奇怪的對我說:在紅寶石,爲什麼 「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
同樣的事情在這裏...我們只得到這個值的其餘部分除以一。它應該是確切的。
這是很奇怪的對我說:在紅寶石,爲什麼 「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
同樣的事情在這裏...我們只得到這個值的其餘部分除以一。它應該是確切的。
或者,簡單地說,浮點是邪惡的。 – 2009-08-18 21:38:25
,這是因爲它不可能準確地表示所有的浮點數。
這是典型的浮點舍入。你根本無法表達對固定數量的浮動位的每一個十進制數,所以一些數值四捨五入到可以表示最接近的值。
由於這個原因,我們建議您不要爲相等比較浮標。比較小於或大於,但從來沒有確切的相等。
http://en.wikipedia.org/wiki/Floating_point#Representable_numbers.2C_conversion_and_rounding
簡單地說,它不是「它應該是準確的」的情況。不要期望從浮點小數。
浮動點並不確切。簡短的版本是不可能在有限的位中存儲無限量的值。
的更長的版本是What Every Computer Scientist Should Know About Floating-Point Arithmetic
歡迎浮點運算。有許多數字不能用標準的浮點數表示法表示出來,只是稍微偏離一點。
這是很容易說明如下:
(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。 – 2009-08-18 21:14:26
這也是ruby-talk郵件列表中約100個線程的副本,或者任何曾經存在的任何編程語言的討論論壇。 – 2009-08-18 23:50:01