2012-11-08 63 views
2

我是Ruby的新手,所以我會先爲我的無知道歉:)我在找到一個客戶帳戶時遇到的問題。其中一些金額爲小數點後爲負數,這會破壞總數。下面是一些簡單的示例代碼...紅寶石 - 增加負浮動值

testnum = 0.00 
puts "###Debug### testnum = #{testnum} (after 0.00)" 
testnum += 5.00 
puts "###Debug### testnum = #{testnum} (after 5.00)" 
testnum += 3.33 
puts "###Debug### testnum = #{testnum} (after 3.33)" 
testnum += -1.00 
puts "###Debug### testnum = #{testnum} (after -1.00)" 
testnum += -2.22 
puts "###Debug### testnum = #{testnum} (after -2.22)" 

的結果吧...

###Debug### testnum = 0.0 (after 0.00) 
###Debug### testnum = 5.0 (after 5.00) 
###Debug### testnum = 8.33 (after 3.33) 
###Debug### testnum = 7.33 (after -1.00) 
###Debug### testnum = 5.109999999999999 (after -2.22) 

所以testnum是增加-2.22,但加入-1.00被罰款後損壞。不知道我做錯了什麼。

回答

1

上校恐慌是正確的關於推理,我不想重複同樣的,還可以使用功能全面。對於如:

1.9.3p194 :001 > 5.109999999999999.round(2) 
=> 5.11 

,因爲您只使用高達2個位數deciaml這應該是你

2

http://floating-point-gui.de/basic/

爲什麼我的數字,像0.1 + 0.2加起來一個漂亮的圓0.3,我反而得到怪異的結果像0.30000000000000004?

因爲在內部,計算機使用的格式(二進制浮點)不能準確地表示數字,如0.1,0.2或0.3。

如果你真的需要你的結果加起來,特別是當你用錢工作時:使用一個特殊的十進制數據類型。

在Ruby中,這是BigDecimal

+0

感謝有用的非常多。在添加它們之前,我使用.to_d將金額轉換爲BigDecimal,並且工作正常。 – user1808965