LUA (Corona SDK)中的math.floor()在增加0.1的情况下返回错误的值。

当我使用 Math.floor 函数对每次增加 0.1 的 double 值进行计算时,出现了一个奇怪的 bug。

只有增加值为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

这是上面代码的结果:

 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

如果可以帮助的话,如果我们对错误值的结果应用一个 模1,我们会得到这样的结果:0.99999999999999

点赞
用户1847592
用户1847592

浮点数很棘手。不要将它们用作循环计数器。

for i = 30, 70 do
    local i = i / 10
    print("val : "..i.." floor : "..math.floor(i))
end
2013-03-20 12:59:02
用户1029976
用户1029976

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

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

你所看到的是浮点数的一般问题。所有Lua中的数字都是浮点数,因此可能存在舍入误差。将0.1加到另一个浮点数上并不完全是0.1,而重复使用时误差会累积。当你认为数字是5.0时,它可能是4.99999999999999999,因此floor返回4。打印语句在打印之前可能会四舍五入。

math库是标准的Lua代码(v5.1),并未为Corona进行修改。

你可以在谷歌上搜索浮点舍入问题,但是在使用浮点数运算时需要小心。

问候,汤姆

- - Corona Labs-Support support@coronalabs.com

2013-03-21 10:27:08