2016-03-03 127 views
-6

爲什麼10.0/3返回3.3333333333333335?這看起來不正確,是嗎?這是一個錯誤嗎?爲什麼10.0/3返回3.3333333333333335?

10.0/3 
# => 3.3333333333333335 
+0

這不是Ruby特定的。大多數語言將float或double類型映射到機器的本地浮動/雙打 –

回答

1

這不是一個錯誤,這是浮點運算的工作原理。一個人不應該計較mantissa太多,而

10.0/3.0 * 3.0 == 10.0 
#⇒ true 
0

浮動對象表示使用原生架構的雙精度浮點表示不精確實數。

如果你看看Ruby文檔,你會發現float是雙精度的,並且被認爲是一個近似的數字。 http://ruby-doc.org/core-1.9.3/Float.html

浮點有不同的算術,是一個不精確的數字。你應該知道它的深奧系統。請參閱以下內容:

http://docs.sun.com/source/806-3568/ncg_goldberg.html

你可以在部門執行round以獲得更準確的答案。

(10.0/3).round(5) 
+0

「round」如何給出準確答案?它切斷了信息。 – sawa

+0

我相信在上述情況下的精度只能精確到15或16位數。這就是爲什麼你會看到最後的結果5. –

+0

原始的誤差小於10 ^( - 15)* 2。將其舍入到更高的數字10 ^( - 5)會使誤差更大。 – sawa