2016-11-11 317 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