2013-03-20 110 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