diff --git a/files/zh-cn/web/javascript/reference/global_objects/number/issafeinteger/index.md b/files/zh-cn/web/javascript/reference/global_objects/number/issafeinteger/index.md index 08596b698e5e9b..d1e5b498f59d62 100644 --- a/files/zh-cn/web/javascript/reference/global_objects/number/issafeinteger/index.md +++ b/files/zh-cn/web/javascript/reference/global_objects/number/issafeinteger/index.md @@ -5,38 +5,46 @@ slug: Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger {{JSRef}} -**`Number.isSafeInteger()`** 方法用来判断传入的参数值是否是一个“安全整数”(safe integer)。 +**`Number.isSafeInteger()`** 静态方法判断提供的值是否是一个*安全整数*。 -一个安全整数是一个符合下面条件的整数: - -- 可以准确地表示为一个 IEEE-754 双精度数字, -- 其 IEEE-754 表示不能是舍入任何其他整数以适应 IEEE-754 表示的结果。. - -比如,`2^53 - 1` 是一个安全整数,它能被精确表示,在任何 IEEE-754 舍入模式(rounding mode)下,没有其他整数舍入结果为该整数。作为对比,`2^53` 就不是一个安全整数,它能够使用 IEEE-754 表示,但是 `2^53 + 1` 不能使用 IEEE-754 直接表示,在就近舍入(round-to-nearest)和向零舍入中,会被舍入为 `2^53`。 - -安全整数范围为 `-(2^53 - 1)` 到 `2^53 - 1` 之间的整数,包含 `-(2^53 - 1)` 和 `2^53 - 1`。 +{{EmbedInteractiveExample("pages/js/number-issafeinteger.html")}} ## 语法 -```plain +```js-nolint Number.isSafeInteger(testValue) ``` ### 参数 - `testValue` - - : 需要检测的参数。 + - : 要测试是否为安全整数的值。 ### 返回值 -一个{{jsxref("Boolean", "布尔值")}} 表示给定的值是否是一个安全整数(safe integer)。 +如果给定的值是一个安全整数,则返回布尔值 `true`。否则返回 `false`。 + +## 描述 + +安全整数由 -(253 - 1) 到 253 - 1 的所有整数组成,包含(±9,007,199,254,740,991)。安全整数是符合以下条件的整数: + +- 可以精确地表示为 IEEE-754 双精度数,并且 +- 其 IEEE-754 表示形式不能是舍入任何其他整数以适应 IEEE-754 表示形式的结果。 + +例如,253 - 1 是一个安全整数:它可以精确地表示,并且在任何 IEEE-754 舍入模式下都没有其他整数舍入结果为该整数。相比之下,253 *不是*一个安全整数:它可以在 IEEE-754 中精确地表示,但整数 253 + 1 不能直接在 IEEE-754 中表示,而是采用就近舍入和向零舍入时,会舍入到 253。 + +处理大约 9 千万亿左右的值时,需要使用[任意精度算术库](https://zh.wikipedia.org/wiki/高精度计算)来实现完全精确性。有关浮点数表示的更多信息,请参阅[程序员需要了解的浮点数算术知识](https://floating-point-gui.de/)。 + +对于更大的整数,请考虑使用 {{jsxref("BigInt")}} 类型。 ## 示例 +### 使用 isSafeInteger() + ```js Number.isSafeInteger(3); // true -Number.isSafeInteger(Math.pow(2, 53)); // false -Number.isSafeInteger(Math.pow(2, 53) - 1); // true +Number.isSafeInteger(2 ** 53); // false +Number.isSafeInteger(2 ** 53 - 1); // true Number.isSafeInteger(NaN); // false Number.isSafeInteger(Infinity); // false Number.isSafeInteger("3"); // false @@ -44,14 +52,6 @@ Number.isSafeInteger(3.1); // false Number.isSafeInteger(3.0); // true ``` -## Polyfill - -```plain -Number.isSafeInteger = Number.isSafeInteger || function (value) { - return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER; -}; -``` - ## 规范 {{Specifications}} @@ -60,8 +60,10 @@ Number.isSafeInteger = Number.isSafeInteger || function (value) { {{Compat}} -## 相关链接 +## 参见 +- [`core-js` 中 `Number.isSafeInteger` 的 polyfill](https://github.com/zloirock/core-js#ecmascript-number) - {{jsxref("Number")}} - {{jsxref("Number.MIN_SAFE_INTEGER")}} - {{jsxref("Number.MAX_SAFE_INTEGER")}} +- {{jsxref("BigInt")}}