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

时间:2013-03-20 12:53:22

标签: lua corona

我在每次使用 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

以上是上述代码的结果:

 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

如果它可以提供帮助,如果我们对错误值的结果应用 modulo 1 ,我们会得到结果: 0.99999999999999

2 个答案:

答案 0 :(得分:4)

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

for i = 30, 70 do 
    local i = i / 10
    print("val : "..i.." floor : "..math.floor(i))
end

答案 1 :(得分:4)

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

以下是我从电晕支持中得到的官方回应:

  

您好,

     

您所看到的是浮点数的一般问题。   Lua中的所有数字都是浮点数,因此是主题   舍入错误。将0.1添加到另一个浮点数不是   当反复使用时,正好为0.1并且误差累积。   当你认为数字是5.0时,它可能是4.99999999999999999,所以   楼层返回4.打印声明可能正在四舍五入   印刷。

     

数学库是标准的Lua代码(v5.1),尚未修改   对于电晕。

     

你可以谷歌主题或浮点四舍五入问题,但在   一般来说,使用浮点数学时需要小心。

     

问候,汤姆

     

- Corona Labs - 支持support@coronalabs.com