2009-12-22 93 views
2

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中的行爲是相同的。

+0

[爲什麼Perl的sprintf未正確舍入浮點數?](http://stackoverflow.com/questions/1651671/why-does-perls-sprintf-not-round-floating-point-numbers-正確) – 2014-06-17 17:27:14

回答

1

是很有用的回憶,也相當具有諷刺意味的去思考,但浮點數僅只代表:(a)幾個分數或(b)所有整數。

因此,有一個確切的表示一個分數必須由兩個(負)冪組成。所以,下面的分數爲0.01與0.99之間唯一的被精確表示:

0.25 
0.50 
0.75 

換句話說,FP與整數打交道時是完全準確的。去搞清楚。

+0

這聽起來不對。你應該得到一個確切的答案,可以在尾數中表示所有負指數(維基百科告訴我現在稱爲「有效數」 - 在我上學後肯定發生過)。所以'2 ** 1/n'應該適用於任何能適合尾數的'n'。沒有? – zetetic 2009-12-23 02:55:44

+0

應該是「可以適用於尾數的任何結果」 – zetetic 2009-12-23 03:00:20

+0

幾乎,但只有當* n *是2的冪。因此,可以精確地表示由* 1/2,1/4,1/8,1/16,1/32 *,...中的一個或多個項組成的分數。 – DigitalRoss 2009-12-23 17:37:45