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

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

希望你能理解我的问题。

4

3 回答 3

1

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

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

1e-6您预先确定的任意误差阈值在哪里

于 2012-12-27T20:35:11.273 回答
0

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

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

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 回答