javascript - 在 JavaScript 中比较两个数字,如果它们是 double 以及 == 或 === 的使用呢?

标签 javascript floating-point comparison

当我用 JavaScript 编写代码时,我很少考虑在比较数字时使用 == 或 === 运算符的后果。然而,JavaScript 数字是 double 的,因此 == 和 === 永远不应该按原样使用。

从关于使用 === 比较两个数字的文档中我们得到:

11.9.6 The Strict Equality Comparison Algorithm

The comparison x === y, where x and y are values, produces true or false. Such a comparison is performed as follows:

  1. If Type(x) is different from Type(y), return false.

  2. If Type(x) is Undefined, return true.

  3. If Type(x) is Null, return true.

  4. If Type(x) is Number, then

    a. If x is NaN, return false.

    b. If y is NaN, return false.

    c. If x is the same Number value as y, return true.

    d. If x is +0 and y is -0, return true.

    e. If x is -0 and y is +0, return true.

    f. Return false.

  5. 如果Type(x)是String,那么如果x和y是完全相同的字符序列(长度相同,对应位置的字符相同),则返回true;否则,返回 false。

  6. 如果 Type(x) 是 bool 值,如果 x 和 y 都为真或都为假,则返回真;否则,返回 false。
  7. 如果 x 和 y 指的是同一个对象,则返回真。否则,返回 false。

注意 该算法在处理有符号零和 NaN 方面不同于 SameValue 算法 (9.12)。

非严格的 == 运算符在比较两个数字(4.a 到 4.f)时具有相同的算法,只是它允许将字符串转换为数字。

那么...该语言本质上是以一定的精度测试 float ,还是使用 C/C++ 和其他语言中常见的普通好旧的 ==?

var a = 1.23;
    b = 1.230000001;

if(a === b) alert("equal?!");

此代码不会产生警报,这意味着它可以像在 C/C++ 中一样工作。

最佳答案

如您所见,如果 ===== 都是数字,则它们的行为相同。

比较数字是否相等时,JavaScript 遵循 IEEE 754 标准。对于大多数用途,这与 C 的 double 类型没有什么不同。这意味着 JavaScript 不会为您做任何精度检查。需要时,您可以编写自己的代码来处理精度损失。


这回答了您的问题,但是您提出了一个非常常见的误解!

JavaScript numbers are double's and as such the == and === should never be used as is.

这背后的实际数学有点复杂。一旦掌握,您就可以通过精确检查获得一些回旋余地。

考虑以下保证的事实:

5 + 6 === 11
3 + 0.5 === 3.5
1.1 + 1 === 2.1
1.230000001 === 1.230000001
40 / 2 === 20
-0 === +0

但是,以下内容可能是对还是错取决于精度:

1.23 === 1.230000001
1.1 + 0.1 === 1.2
11 / 10 * 11 === 11 * 11 / 10

为了更容易处理 double ,这些条件不会导致大范围 float 的精度损失:

  • 不带小数部分的 double 加、减和乘
  • 除以没有小数部分且可整除的双数
  • 将表示为分母 2、4、8、16 的分数的 double 相加,...
  • 将任何 double 乘以 0、1、-1、2、-2、4、-4、8、-8、...
  • 将任意双除以 1、-1、2、-2、4、-4、8、-8 ...

最后,如果您想了解有关 float 学的更多信息,这篇文章被大量引用(但可能会根据您的需要过于详细):What Every Computer Scientist Should Know About Floating-Point Arithmetic .

关于javascript - 在 JavaScript 中比较两个数字,如果它们是 double 以及 == 或 === 的使用呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23841001/

相关文章:

c++ - 我们可以依靠 op== 来二进制比较浮点值吗?

xml - Scala XML.loadString 与文字表达式

javascript - 在不使用返回值的情况下执行映射操作是反模式吗?

javascript - Highcharts 中的多个 X 轴值

c - C中的精密浮点运算问题

floating-point - 为什么 exponent(0.0) 是一个 DomainError?

algorithm - 一个类似于 Levenshtein 但针对 Qwerty 键盘加权的好算法?

swift - 如何在 Swift 中比较 CGError

javascript - Azure AD V2/msal.js 限制个人账户?

javascript - 获取高度并应用于每个元素失败?