gpt4 book ai didi

javascript - 检查两个具有浮点值的对象是否相等?

转载 作者:行者123 更新时间:2023-11-30 11:54:52 26 4
gpt4 key购买 nike

正在为我的处理二进制的 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% 相同或其他任何值,则它们应被视为相等。

最佳答案

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

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

在 JavaScript 中,机器 epsilon 可用作 Number.EPSILON , 并且被定义为 1 和大于 1 的最小数之间的差 and 可以表示为 Number。大多数语言都有类似的常量,通常用于基于公差的比较。

基于容差的比较将浮点比较从简单的相等转换为减法和比较。如果你通常会写

if (a === b) { ... }

您可以使用绝对值和 tolerance 来消除浮点怪异:

var tolerance = Number.EPSILON;
if (Math.abs(a - b) < tolerance) { ... }

如果 ab 之间的差异小于 tolerance,您将它们视为相等。

有关更细微(但对您的情况可能有点矫枉过正)的方法,请参阅 The Floating Point Guide's section on comparison .那里介绍的实现是用 Java 编写的,但很可能可以毫不费力地移植到 JavaScript。

关于javascript - 检查两个具有浮点值的对象是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38317779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com