2016-11-11 318 views
2

能有人爲什麼盧阿運行解釋:Lua的小數精度損失

return 256.65 * 1000000 + .000000005 - 256 * 1000000 gives 649999.99999997 

return 255.65 * 1000000 + .000000005 - 255 * 1000000 and 
return 268.65 * 1000000 + .000000005 - 268 * 1000000 give 650000.0 ? 

從我可以看到它似乎是嚴格十進制65個問題(而且似乎還我知道這與浮點運算有關,但我仍然很好奇這些值的特別之處,特別是

+2

當打印數量'通過發出命令x''打印(X)',Lua中顯示你'的String.Format( 「%14G中」,X)',而不是數量的所有可用數字' x'(參見[Lua源代碼](https://www.lua.org/source/5.3/luaconf.h.html#LUA_NUMBER_FMT))。你可以嘗試'print(string.format(「%。17g」,x))'查看更多數字。 –

+1

您的第二個代碼段無效。 – warspyking

+0

你是什麼意思,它是無效的?爲了清楚起見,我將它們表示爲2個獨立的代碼片段,而不是2個返回語句並編輯在一起。我很抱歉,如果這不清楚 – David

回答

2

什麼是這些值的特殊之處在於0.65不是二進制分數(即使它是小數),所以不能完全用浮點數表示。

有關記錄,這不是特定於Lua。在C中也會發生同樣的事情。

+1

沒錯,但也沒有.64,並沒有這個問題。此外,這並不能解釋爲什麼它不發生在252.65例如 – David

1

出於同樣的原因,10/3是基數爲10的重複部分。在基數3中,除以3會得到整數。在基數2中 - 用於表示計算機中的數字 - 您生成的數字類似地導致可以精確表示的分數。

Further reading.

+1

是的,我明白這一切。我仍然不明白255到268範圍內有什麼魔力。如果你說這是因爲.65不能精確表示,那麼爲什麼259.65不會發生。此外,爲什麼這不會發生.64或任何其他十進制不能用二進制精確表示 – David