Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查两个对象具有浮点值时是否相等?_Javascript_Binary_Floating Point_Equality - Fatal编程技术网

Javascript 检查两个对象具有浮点值时是否相等?

Javascript 检查两个对象具有浮点值时是否相等?,javascript,binary,floating-point,equality,Javascript,Binary,Floating Point,Equality,为处理二进制代码的Javascript程序编写一些测试用例,现在我只是使用stringify检查值和期望值是否相等: JSON.stringify(val) === JSON.stringify(expected) 除了有浮点值的情况外,这一切都很好。情况就是这样: Given Value: [10,20,30,32.400001525878906,{"test":3,"asdf":23}] Expected Value: [10,20,30,32.4,{"test":3,"asdf":

为处理二进制代码的Javascript程序编写一些测试用例,现在我只是使用stringify检查值和期望值是否相等:

JSON.stringify(val) === JSON.stringify(expected)
除了有浮点值的情况外,这一切都很好。情况就是这样:

Given Value:    [10,20,30,32.400001525878906,{"test":3,"asdf":23}]
Expected Value: [10,20,30,32.4,{"test":3,"asdf":23}]

Test Failed!

所以我想我不能再使用stringify来检查我的两个对象/数组是否相等了。检查两个可能深度嵌套的对象/数组是否相等的好方法是什么,同时还要考虑浮点值?也就是说,如果两个浮点值99.99%相同或其他任何值,则应将其视为相等。

您需要按顺序测试数组中的每个元素,并且需要对对象进行递归测试。这通常被称为深度比较或深度相等。您应该能够使用一个递归函数来检查比较符的类型

比较浮点值时,需要使用公差。通过取两个数字相减的绝对值,然后将其与您选择的固定公差值或称为ε的小数值进行比较,可以实现此目的

在JavaScript中,机器epsilon可用为,并定义为1与大于1的最小数字之间的差值可以表示为
数字。大多数语言中都有类似的常量,通常用于基于公差的比较

基于容差的比较将浮点比较从简单的相等转换为减法比较。如果你平时写信的话

if (a === b) { ... }
您可以使用绝对值和
公差来消除浮点奇怪:

var tolerance = Number.EPSILON;
if (Math.abs(a - b) < tolerance) { ... }
var公差=Number.EPSILON;
if(Math.abs(a-b)<公差){…}
如果
a
b
之间的差值小于
公差
,则将它们视为相等


有关更细微的(但可能对您的案例而言是过度的)方法,请参阅。这里介绍的实现是用Java实现的,但是很可能不费吹灰之力就可以移植到JavaScript。

您需要编写一个递归等价性测试程序。当它到达一个浮点数时,它需要将它们与公差进行比较,而不是
=
。使用JSON.stringify比较对象不是一个好主意,因为没有顺序保证,所以两个对象可能具有相同的属性和值,但计算结果不“相等”。你需要对属性和值进行循环,有。我认为Number.EPSILON太小了,不能使用。我认为应该根据实际数字(或它们的差异)按比例调整。因此,与1.0的ulp相比,相当大的数字是不存在差异的。是的,我试图在这里触及这一点,但不一定成功。:)接受关于如何更好地说出答案的建议。