【问题标题】:LUA (Corona SDK) math.floor() return wrong value with increment of 0.1LUA (Corona SDK) math.floor() 返回错误值,增量为 0.1
【发布时间】:2013-03-20 12:53:21
【问题描述】:

当我对每次递增 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

如果有帮助,如果我们对错误值的结果应用 模 1,我们会得到以下结果:0.99999999999999

【问题讨论】:

标签: lua coronasdk


【解决方案1】:

浮点数太可怕了。不要将它们用作循环计数器。

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

【讨论】:

  • 谢谢,它是这样工作的,但问题是我在实际项目中没有使用 for 循环。我使用一个简单的加法(更新字符位置)。我尝试用计算值(例如 1/10)替换代码中的每个浮点数,但它仍然不起作用:(
  • @user1029976 - 您可以使用四舍五入到最接近的 n/10:x = math.floor(x*10+0.5)/10
  • @user1029976 根本问题是 0.1(或 1/10)不是有限二进制数(它是 0.0001100110011...)。浮点表示必须在某些时候限制它,这就是为什么在某些时候会出现舍入错误。改为将您的角色位置增加 1,并仅在您实际使用该值时将其除以 10。
【解决方案2】:

确实是常见的浮动问题,

这是我从电晕支持收到的官方回复:

你好,

您看到的是浮点数的一般问题。 Lua 中的所有数字都是浮点数,因此是主题 舍入误差。另一个浮点数加 0.1 不是 精确到 0.1,并且在反复使用时会累积误差。 当你认为数字是 5.0 时,可能是 4.99999999999999999,所以 floor 返回 4. print 语句可能在之前四舍五入 打印。

数学库是标准 Lua 代码 (v5.1) 并且没有被修改 为电晕。

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

问候,汤姆

-- Corona Labs - 支持 support@coronalabs.com

【讨论】:

    猜你喜欢
    • 2012-05-08
    • 2014-02-27
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2013-03-23
    相关资源
    最近更新 更多