当我用 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:
If Type(x) is different from Type(y), return false.
If Type(x) is Undefined, return true.
If Type(x) is Null, return true.
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.
如果Type(x)是String,那么如果x和y是完全相同的字符序列(长度相同,对应位置的字符相同),则返回true;否则,返回 false。
- 如果 Type(x) 是 bool 值,如果 x 和 y 都为真或都为假,则返回真;否则,返回 false。
- 如果 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/