2013-03-20 111 views
5

增量返回错误值我有一个奇怪的错误,当我在递增,每次0.1双值使用Math.floor功能。LUA(科罗娜SDK)math.floor()以0.1

它发生仅具有0.1的增量,并开始在值5

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

你可以自己尝试一下,用这种简单的代码:

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

+0

的可能重复[?为什么Lua的算术不等于本身(http://stackoverflow.com/questions/6366954/why-is-lua-arithmetic-is-not-equal-to-its-own) – finnw 2013-03-20 17:11:52

回答

4

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

下面是官方回应我从电晕得到的支持已经:

你好,

你们看到的是一般浮点数的问题。 Lua中的所有数字都是浮点数,因此需要使用 来舍入错误。将0.1加到另一个浮点数并不是 恰好为0.1,并且反复使用时会累积错误。 当您认为数字为5.0时,它可能是4.99999999999999999,因此 指定返回4.打印语句可能在打印 之前四舍五入。

数学库是标准Lua代码(v5.1),并没有被修改为Corona的 。

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

的问候,汤姆

- 科罗纳实验室 - 支持[email protected]

4

F游荡点数是恶魔。不要将它们用作循环计数器。

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

谢谢,它以这种方式工作,但事情是我不在我的真实项目中使用for循环。 我使用一个简单的添加(更新字符位置)。 我试图用我的代码中的每个浮点数代替计算值(如1/10),它仍然不工作:( – chip 2013-03-20 13:10:06

+0

@ user1029976 - 您可以使用舍入到最近的n/10:'x = math.floor (X * 10 + 0。5)/ 10' – 2013-03-20 13:44:38

+0

@ user1029976潜在的问题是0.1(或1/10)不是有限的二进制数(它是'0.0001100110011 ...')。浮点数表示必须在某个时间点上限,这就是为什么你在某个时刻舍入误差的原因。只需将你的角色位置增加1,并且只有在实际使用该值时才将其除以10。 – 2013-03-20 14:16:47