Ruby是否有一個四捨五入的錯誤?爲什麼它的行爲如下:Ruby中四捨五入不一致?
>> [1.14, 1.15, 1.16].map{|x| "%.1f" % x}
=> ["1.1", "1.1", "1.2"]
>> [1.4, 1.5, 1.6].map{|x| "%.0f" % x}
=> ["1", "2", "2"]
因爲,爲什麼1.15會舍入到1.1,但是1.5會舍入到2?至少,這不是不一致嗎?在紅寶石1.9.1和紅寶石1.8.7中的行爲是相同的。
Ruby是否有一個四捨五入的錯誤?爲什麼它的行爲如下:Ruby中四捨五入不一致?
>> [1.14, 1.15, 1.16].map{|x| "%.1f" % x}
=> ["1.1", "1.1", "1.2"]
>> [1.4, 1.5, 1.6].map{|x| "%.0f" % x}
=> ["1", "2", "2"]
因爲,爲什麼1.15會舍入到1.1,但是1.5會舍入到2?至少,這不是不一致嗎?在紅寶石1.9.1和紅寶石1.8.7中的行爲是相同的。
嘿嘿,我什至沒有想到這一點。回想起來很有意義。 – Peter 2009-12-22 23:28:12
您正在使用浮點數。浮點數不準確。有關標準的介紹,請參閱http://en.wikipedia.org/wiki/IEEE_754-2008。
簡短的版本是:永遠不要使用浮動的任何事情,你需要任何方式的精度!
是很有用的回憶,也相當具有諷刺意味的去思考,但浮點數僅只代表:(a)幾個分數或(b)所有整數。
因此,有一個確切的表示一個分數必須由兩個(負)冪組成。所以,下面的分數爲0.01與0.99之間唯一的被精確表示:
0.25
0.50
0.75
換句話說,FP與整數打交道時是完全準確的。去搞清楚。
這聽起來不對。你應該得到一個確切的答案,可以在尾數中表示所有負指數(維基百科告訴我現在稱爲「有效數」 - 在我上學後肯定發生過)。所以'2 ** 1/n'應該適用於任何能適合尾數的'n'。沒有? – zetetic 2009-12-23 02:55:44
應該是「可以適用於尾數的任何結果」 – zetetic 2009-12-23 03:00:20
幾乎,但只有當* n *是2的冪。因此,可以精確地表示由* 1/2,1/4,1/8,1/16,1/32 *,...中的一個或多個項組成的分數。 – DigitalRoss 2009-12-23 17:37:45
[爲什麼Perl的sprintf未正確舍入浮點數?](http://stackoverflow.com/questions/1651671/why-does-perls-sprintf-not-round-floating-point-numbers-正確) – 2014-06-17 17:27:14