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

LUA(coronasdk)math.floor()返回错误的值,增量为0.1,lua,coronasdk,Lua,Coronasdk,当我对每次递增0.1的双倍值使用Math.floor函数时,我有一个奇怪的错误 仅当增量为0.1且从值5开始时才会发生 示例:数学地板(4)返回4,但数学地板(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 Simul

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

仅当增量为0.1且从值5开始时才会发生

示例:数学地板(4)返回4,但数学地板(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.9999999999999浮点数是邪恶的。不要将它们用作循环计数器

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

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

以下是我从corona support收到的官方回复:

你好,

您看到的是浮点数的一般问题。 Lua中的所有数字都是浮点数,因此受 四舍五入误差。不允许将0.1添加到另一个浮点数 精确到0.1,反复使用时累积误差。 当你认为数字是5.0时,它可能是4.999999999999,所以 四楼返回。print语句可能在前四舍五入 印刷

数学库是标准Lua代码(v5.1),尚未修改 为了科罗纳

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

你好,汤姆

--科罗纳实验室-支持support@coronalabs.com


谢谢,它是这样工作的,但问题是我在实际项目中没有使用for循环。我使用一个简单的加法(更新角色位置)。我试图用计算值(如1/10)替换代码中的每个浮点数,但仍然不起作用:(@user1029976-可以使用四舍五入到最接近的n/10:
x=math.floor(x*10+0.5)/10
@user1029976根本问题是0.1(或1/10)不是一个有限的二进制数(它是
0.000110011…
)。浮点表示法必须在某一点上对其进行限制,这就是在某一点上出现舍入错误的原因。请将字符位置增加1,只有在实际使用该值时才将其除以10。可能重复