2013-09-23 40 views
-1

奇怪..的Ruby 1.8.7轉換9,95浮到994 INT

$ (9.95*100).to_i 
=> 994 

然後,

$ (9.95*100).round.to_i 
=> 995 

好像浮點值(大約)9.9499999 ......和

to_i 

印章的十進制值,因此994

但是有誰知道爲什麼?

+2

歡迎來到浮點數的喜悅,其中一切都近似,人的期望並不重要。 –

+3

to_i被記錄爲截斷而非四捨五入。你在期待什麼? –

+1

我會在這裏留下通常的鏈接:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – mcfinnigan

回答

3

瞭解更多關於與準確性這裏的問題:https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

短版:切勿使用花車作爲貨幣表示。

+0

或者,甚至更好,從不使用浮點而不理解其侷限性。 – mcfinnigan

+2

@mcfinnigan:爲什麼只是浮點?如果不瞭解其侷限性,也可以使用整數算術。 –

+0

@EricPostpischil整數算術的侷限性通常更加明顯。整數工作如預期,直到你遇到溢出,然後東西往往突然出錯。細微的四捨五入錯誤積累在例如循環中可能需要更多時間來注意和糾正,因爲歸納會導致人們相信FP將以確定性的方式工作,如整數 - 因此我的發言。 – mcfinnigan

0

您對#round的呼叫將它從「9.95」的內部表示中調出,這是一個稍微不準確的數字,正好在它的下面)。所以這個工作,而直接調用#to_i只是(總是)截斷,所以它看到994.99999並截斷到994.用Ruby 1.9.x +它顯示這更清楚地(好或壞),所以你可以看到什麼是繼續。

>> 9.95*100 
=> 994.9999999999999 
>> (9.95*100).round 
=> 995