简单的运动计算给出错误的结果

时间:2012-12-27 20:28:55

标签: javascript numbers

我有这个功能。

    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 CALCULATED是假的。

我如何管理这个=我不能使用round,因为它应该能够返回138.5,如果最终结果是。

希望你理解我的问题。

3 个答案:

答案 0 :(得分:1)

始终浮点=比较应该像这样:

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

其中1e-6是您事先确定的任意错误阈值

答案 1 :(得分:0)

您绝不应该以这种方式比较浮点值。 (Waleed Khan在评论中的链接很好地解释了为什么会发生这种情况)

相反,您可以执行以下操作来检查ab的相等性:

if (a < b + 0.0001 && a > b - 0.0001) {
  // values are "equal"
}

答案 2 :(得分:0)

您可以从SO上的另一个answer舍入到一定数量的数字,使用以下内容:

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

这样您就不需要进行花哨的比较。