繁体   English   中英

检查数字是否几乎相等javascript

[英]check whether the number is nearly equal javascript

我想知道是否可以?

假设:

var a = 2592;
var b = 2584;
if(a nearly equal to b) {
// do something
}

像这样。

var diff = Math.abs( a - b );

if( diff > 50 ) {
    console.log('diff greater than 50');
}

如果使用Math.abs和简单比较,绝对差异是否大于50那将进行比较。

这是老派的方法来做到这一点......

approxeq = function(v1, v2, epsilon) {
  if (epsilon == null) {
    epsilon = 0.001;
  }
  return Math.abs(v1 - v2) < epsilon;
};

所以,

approxeq(5,5.000001)

是真的,而

approxeq(5,5.1)

是假的。

您可以明确调整 epsilon 中的传递以满足您的需要。 千分之一通常涵盖我的 javascript 舍入问题。

var ratio = 0;
if ( a > b) {
   ratio = b / a;
}
else {
    ratio = a / b;
}
if (ratio > 0.90) {
    //do something
}

The Software Barbarian 的一行 Es6 方式版本:

 const approxeq = (v1, v2, epsilon = 0.001) => Math.abs(v1 - v2) <= epsilon; console.log(approxeq(3.33333, 3.33322)); // true console.log(approxeq(2.3, 2.33322)); // false console.log(approxeq(3, 4, 1)); // true

我将其更改为在边距中包含数字。 因此,1 和 2 之间的 epsilon 边距为 1 approxeqtrue

浮点比较很快就会变得复杂。 在很多情况下,它并不像 diff 小于 epsilon 那样简单。

这是一篇关于这个主题的文章,虽然不是特定于 javascript 的。

https://floating-point-gui.de/errors/comparison/

域名注册地址:

  1. 当被比较的数字之一非常接近于零时,从较大的数字中减去较小的可能会丢失精度数位,使差异看起来比它小(或零)。
  2. 具有不同符号的非常小的数字以奇怪的方式工作。
  3. 除以零会导致问题。

文章中有一个函数(java)可以更好地解决这些情况:

public static boolean nearlyEqual(float a, float b, float epsilon) {
    final float absA = Math.abs(a);
    final float absB = Math.abs(b);
    final float diff = Math.abs(a - b);

    if (a == b) { // shortcut, handles infinities
            return true;
    } else if (a == 0 || b == 0 || (absA + absB < Float.MIN_NORMAL)) {
            // a or b is zero or both are extremely close to it
            // relative error is less meaningful here
            return diff < (epsilon * Float.MIN_NORMAL);
    } else { // use relative error
            return diff / Math.min((absA + absB), Float.MAX_VALUE) < epsilon;
    }
}

在你抱怨之前:是的,那是 Java,所以你必须用 Javascript 重写它。 只是为了说明算法,只是从文章中复制过来的。

我仍在寻找解决此问题的彻底解决方案,理想情况下使用 NPM 包,这样我就不必每次需要时都再次弄清楚。

编辑:我找到了一个包,它实现了上面链接的文章中的解决方案(在他们的自述文件中有相同的链接)。

https://www.npmjs.com/package/@intocode-io/nearly-equal

与其他答案中显示的其他解决方案相比,这将是一个不易出错的解决方案。 有几个 npm 包可以实现简单的解决方案,如上所述,这些解决方案的错误情况接近于零。 在使用它们之前,请确保查看源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM