Why are two different numbers equal in JavaScript?(为什么 JavaScript 中两个不同的数字相等?)
问题描述
我一直在玩 JavaScript 控制台,突然决定试试这个:
I've been messing around with a JavaScript console, when I suddenly decided to try this:
<代码> 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 代码>
令人惊讶的是,它们是相等的:
Surprisingly, they're equal:
为什么会这样?它们显然是不同的数字(即使 0xFFFF...FFFF
短了一位)
Why does it happen? They're clearly different numbers (even the 0xFFFF...FFFF
is one digit shorter)
如果我将 F
添加到 0xFFFF...FF
,它们不再相等:<代码> 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 代码>
If I add a F
to the 0xFFFF...FF
, they're not equal anymore:
0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
这是预期的行为吗?
推荐答案
JavaScript 中的所有数字在内部由 64 位浮点数(参见 §4.3.19 规范).这意味着它可以精确地表示从 0
到 9007199254740992
的每个整数(十六进制值 0x20000000000000
).任何大于它(或小于它的负数)的整数可能需要四舍五入到最接近的近似值.
All numbers in JavaScript are internally represented by 64-bit floating point numbers (see §4.3.19 of the specification). That means it can exactly represent every integer from 0
up to 9007199254740992
(hex value 0x20000000000000
). Any integers greater than that (or less than it's negative counterpart) may need to be rounded to the closest approximate value.
观察:
9007199254740992 === 9007199254740993
> true
但是,四舍五入到足够不同的近似值的两个数字在比较它们时仍会得出不同的值.例如:
However, two numbers that are rounded to sufficiently different approximate values still evaluate to different values when you compare them. For example:
9007199254740992 === 9007199254740994
> false
这就是您在添加另一个 F
数字的第二个片段中看到的内容.
This is what you're seeing in the second snippet where you add another F
digit.
注意:ECMAScript 规范现在定义了 Number.MAX_SAFE_INTEGER
作为一个全局常量,等于 9007199254740991
.
Note: The ECMAScript specification now define Number.MAX_SAFE_INTEGER
as a global constant equal to 9007199254740991
.
这篇关于为什么 JavaScript 中两个不同的数字相等?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么 JavaScript 中两个不同的数字相等?


基础教程推荐
- 如何使用TypeScrip将固定承诺数组中的项设置为可选 2022-01-01
- Electron 将 Node.js 和 Chromium 上下文结合起来意味着 2022-01-01
- 我可以在浏览器中与Babel一起使用ES模块,而不捆绑我的代码吗? 2022-01-01
- Vue 3 – <过渡>渲染不能动画的非元素根节点 2022-01-01
- 自定义 XMLHttpRequest.prototype.open 2022-01-01
- html表格如何通过更改悬停边框来突出显示列? 2022-01-01
- 直接将值设置为滑块 2022-01-01
- 用于 Twitter 小部件宽度的 HTML/CSS 2022-01-01
- Chart.js 在线性图表上拖动点 2022-01-01
- 如何使用JIT在顺风css中使用布局变体? 2022-01-01