LUA(Corona SDK)math.floor()返回错误的值,增量为0.1

chi*_*hip 5 lua coronasdk

当我在每次增加0.1的双值上使用Math.floor函数时,我有一个奇怪的错误.

它仅以0.1的增量发生并从值5开始

例如:math.floor(4)返回4但math.floor(5)返回4 !!!

您可以使用这段简单的代码自行尝试:

for i=3,7,0.1 do 
    print("val : "..i.." floor : "..math.floor(i))
end
Run Code Online (Sandbox Code Playgroud)

以下是上述代码的结果:

 Corona Simulator[1494:707] val : 3 floor : 3
 Corona Simulator[1494:707] val : 3.1 floor : 3
 Corona Simulator[1494:707] val : 3.2 floor : 3
 Corona Simulator[1494:707] val : 3.3 floor : 3
 Corona Simulator[1494:707] val : 3.4 floor : 3
 Corona Simulator[1494:707] val : 3.5 floor : 3
 Corona Simulator[1494:707] val : 3.6 floor : 3
 Corona Simulator[1494:707] val : 3.7 floor : 3
 Corona Simulator[1494:707] val : 3.8 floor : 3
 Corona Simulator[1494:707] val : 3.9 floor : 3
 Corona Simulator[1494:707] val : 4 floor : 4
 Corona Simulator[1494:707] val : 4.1 floor : 4
 Corona Simulator[1494:707] val : 4.2 floor : 4
 Corona Simulator[1494:707] val : 4.3 floor : 4
 Corona Simulator[1494:707] val : 4.4 floor : 4
 Corona Simulator[1494:707] val : 4.5 floor : 4
 Corona Simulator[1494:707] val : 4.6 floor : 4
 Corona Simulator[1494:707] val : 4.7 floor : 4
 Corona Simulator[1494:707] val : 4.8 floor : 4
 Corona Simulator[1494:707] val : 4.9 floor : 4
 Corona Simulator[1494:707] val : 5 floor : 4
 Corona Simulator[1494:707] val : 5.1 floor : 5
 Corona Simulator[1494:707] val : 5.2 floor : 5
 Corona Simulator[1494:707] val : 5.3 floor : 5
 Corona Simulator[1494:707] val : 5.4 floor : 5
 Corona Simulator[1494:707] val : 5.5 floor : 5
 Corona Simulator[1494:707] val : 5.6 floor : 5
 Corona Simulator[1494:707] val : 5.7 floor : 5
 Corona Simulator[1494:707] val : 5.8 floor : 5
 Corona Simulator[1494:707] val : 5.9 floor : 5
 Corona Simulator[1494:707] val : 6 floor : 5
 Corona Simulator[1494:707] val : 6.1 floor : 6
 Corona Simulator[1494:707] val : 6.2 floor : 6
 Corona Simulator[1494:707] val : 6.3 floor : 6
 Corona Simulator[1494:707] val : 6.4 floor : 6
 Corona Simulator[1494:707] val : 6.5 floor : 6
 Corona Simulator[1494:707] val : 6.6 floor : 6
 Corona Simulator[1494:707] val : 6.7 floor : 6
 Corona Simulator[1494:707] val : 6.8 floor : 6
 Corona Simulator[1494:707] val : 6.9 floor : 6
 Corona Simulator[1494:707] val : 7 floor : 6
Run Code Online (Sandbox Code Playgroud)

如果它可以帮助,如果我们在错误值的结果上应用模1,我们得到这个结果:0.99999999999999

chi*_*hip 4

这确实是一个常见的浮动问题,

以下是我从 Corona 支持处收到的官方回复:

你好,

您所看到的是浮点数的普遍问题。Lua 中的所有数字都是浮点数,因此会出现舍入误差。另一个浮点数加上 0.1 并不完全是 0.1,而且反复使用时误差会累积。当你认为数字是5.0时,它可能是4.999999999999999999,所以floor返回4。打印语句可能在打印之前进行了舍入。

数学库是标准 Lua 代码 (v5.1),未针对 Corona 进行修改。

您可以通过谷歌搜索主题或浮点舍入问题,但一般来说,在使用浮点数学时需要小心。

问候,汤姆

-- Corona 实验室 - 支持 support@coronalabs.com