5

毎回0.1ずつ増加する double 値で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

4

2 に答える 2

4

Floating point numbers are devilish. Don't use them as loop counters.

for i = 30, 70 do 
    local i = i / 10
    print("val : "..i.." floor : "..math.floor(i))
end
于 2013-03-20T12:59:02.427 に答える
4

実際、これは一般的なフロートの問題です。

コロナサポートから受け取った公式の回答は次のとおりです。

こんにちは、

あなたが見ているのは、浮動小数点数に関する一般的な問題です。Lua のすべての数値は浮動小数点数であるため、丸め誤差の影響を受けます。別の浮動小数点数に 0.1 を加算しても正確には 0.1 ではなく、何度も使用すると誤差が累積します。数値が 5.0 だと思ったら、4.99999999999999999 か​​もしれないので、floor は 4 を返します。print ステートメントは、印刷前に切り上げられている可能性があります。

数学ライブラリは標準の Lua コード (v5.1) であり、コロナ用に変更されていません。

件名または浮動小数点の丸めの問題をグーグルで検索できますが、一般に、浮動小数点演算を使用する場合は注意が必要です。

よろしく、トム

-- コロナラボ - サポート support@coronalabs.com

于 2013-03-21T10:27:08.870 に答える