我想知道是否可能?
让我们假设:
var a = 2592;
var b = 2584;
if(a nearly equal to b) {
// do something
}
答案 0 :(得分:21)
喜欢这样。
var diff = Math.abs( a - b );
if( diff > 50 ) {
console.log('diff greater than 50');
}
如果使用50
和简单比较,绝对差值大于Math.abs
,那就可以比较。
答案 1 :(得分:8)
这是旧学校的方式......
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)
是假的。
您可以明确调整epsilons中的传递以满足您的需求。千分之一通常涵盖了我的javascript舍入问题。
答案 2 :(得分:1)
var ratio = 0;
if ( a > b) {
ratio = b / a;
}
else {
ratio = a / b;
}
if (ratio > 0.90) {
//do something
}
答案 3 :(得分:0)
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 approxeq
在1和2之间为true
答案 4 :(得分:0)
浮点比较很快就变得复杂了。在很多情况下,它并不像 diff 小于 epsilon 那样简单。
这是一篇关于这个主题的文章,虽然不是针对 javascript 的。
https://floating-point-gui.de/errors/comparison/
TLDR:
文章中有一个函数(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 包可以实现简单的解决方案,如上所述,这些解决方案的错误情况接近于零。在使用它们之前,请务必查看来源。