0

私はこの機能を持っています。

    Calculations.add(this, //CONTEXT
        function () { //CALUCATE
            this.position.x += (this.movementSpeed.x / 10);
        }, 
        function () { //HAVE CALCULATED
            return (this.position.x === (tempX + this.movementSpeed.x));
        }
    );

結果を実行しましたが、結果が間違っている場合があります。原因私は、それが10回計算された場合、それHAVE CALCULATEDが真実になることを知っています。

しかし、時々それは決してありません...そしてそれは私のアプリを殺します。

結果が138になるはずだとしましょう。計算後、138.000000000006が得られますが、これは138ではなく、HAVE CALCULATEDfalseです。

これをどのように管理できますか=最終結果がそれである場合、138.5を返すことができるはずなので、ラウンドを使用できません。

私の質問を理解していただければ幸いです。

4

3 に答える 3

1

常に浮動小数点=比較は次のように実行する必要があります。

Math.abs( a - b ) < 1e-6

ここ1e-6で、は事前に決定した任意のエラーしきい値です

于 2012-12-27T20:35:11.273 に答える
0

この方法で浮動小数点値を比較しないでください。(コメントのWaleed Khanからのリンクは、これが発生する理由を説明しています)

代わりに、次のようなことを実行して、との同等性を確認できaますb

if (a < b + 0.0001 && a > b - 0.0001) {
  // values are "equal"
}
于 2012-12-27T20:33:18.290 に答える
0

SOに関する別の回答から、次のようなものを使用して、特定の桁数に丸めることができます。

function roundNumber(n, digits) {
  var multiple = Math.pow(10, digits);
  return Math.round(n * multiple) / multiple;;
}

このように、あなたは派手な比較を必要としません。

于 2012-12-27T20:37:41.623 に答える