安全整数和 Number.isSafeInteger()
安全整数和 Number.isSafeInteger()
JavaScript 能够准确表示的整数范围在-2^53
到2^53
之间(不含两个端点),超过这个范围,无法精确表示这个值。
Math.pow(2, 53) // 9007199254740992
9007199254740992 // 9007199254740992
9007199254740993 // 9007199254740992
Math.pow(2, 53) === Math.pow(2, 53) + 1
// true
上面代码中,超出 2 的 53 次方之后,一个数就不精确了。
ES6 引入了Number.MAX_SAFE_INTEGER
和Number.MIN_SAFE_INTEGER
这两个常量,用来表示这个范围的上下限。
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1
// true
Number.MAX_SAFE_INTEGER === 9007199254740991
// true
Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER
// true
Number.MIN_SAFE_INTEGER === -9007199254740991
// true
上面代码中,可以看到 JavaScript 能够精确表示的极限。
Number.isSafeInteger()
则是用来判断一个整数是否落在这个范围之内。
Number.isSafeInteger('a') // false
Number.isSafeInteger(null) // false
Number.isSafeInteger(NaN) // false
Number.isSafeInteger(Infinity) // false
Number.isSafeInteger(-Infinity) // false
Number.isSafeInteger(3) // true
Number.isSafeInteger(1.2) // false
Number.isSafeInteger(9007199254740990) // true
Number.isSafeInteger(9007199254740992) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false
这个函数的实现很简单,就是跟安全整数的两个边界值比较一下。
Number.isSafeInteger = function (n) {
return (typeof n === 'number' &&
Math.round(n) === n &&
Number.MIN_SAFE_INTEGER <= n &&
n <= Number.MAX_SAFE_INTEGER);
}
实际使用这个函数时,需要注意。验证运算结果是否落在安全整数的范围内,不要只验证运算结果,而要同时验证参与运算的每个值。
Number.isSafeInteger(9007199254740993)
// false
Number.isSafeInteger(990)
// true
Number.isSafeInteger(9007199254740993 - 990)
// true
9007199254740993 - 990
// 返回结果 9007199254740002
// 正确答案应该是 9007199254740003
上面代码中,9007199254740993
不是一个安全整数,但是Number.isSafeInteger
会返回结果,显示计算结果是安全的。这是因为,这个数超出了精度范围,导致在计算机内部,以9007199254740992
的形式储存。
9007199254740993 === 9007199254740992
// true
所以,如果只验证运算结果是否为安全整数,很可能得到错误结果。下面的函数可以同时验证两个运算数和运算结果。
function trusty (left, right, result) {
if (
Number.isSafeInteger(left) &&
Number.isSafeInteger(right) &&
Number.isSafeInteger(result)
) {
return result;
}
throw new RangeError('Operation cannot be trusted!');
}
trusty(9007199254740993, 990, 9007199254740993 - 990)
// RangeError: Operation cannot be trusted!
trusty(1, 2, 3)
// 3
安全整数和 Number.isSafeInteger()相关推荐
- 【ES6】数值的拓展
[ES6]数值的拓展 二.Number.isFinite(),Number.isNaN() 三.Number.parseInt(),Number.parseFloat() 四.Number.isInt ...
- javascript 判断为负数_JavaScript从零开始——标准库(7)
今天的重点,是数值(Number)对象. 1 概念 Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用. 作为构造函数时,它用于生成值为数值的对象: 上面代码中,Num ...
- javascript --- polyfill中几个常用方法
ES6中,新增了许多有用的方法,下面分享几个ES6之前得版本写的polyfill Number.EPSILON: // 机器精度,并判断2个数是否相等 if(!Number.EPSILON){Numb ...
- ES6标准入门(第二版)pdf
下载地址:网盘下载 内容简介 · · · · · · ES6(又名 ES2105)是 JavaScript 语言的新标准,2015 年 6 月正式发布后,得到了迅速推广,是目前业界超级活跃的计算机语 ...
- “睡服”面试官系列第九篇之数值的扩展(建议收藏学习)
目录 1. 二进制和八进制表示法 2. Number.isFinite(), Number.isNaN() 3. Number.parseInt(), Number.parseFloat() 4. N ...
- ES6的新特性(5)——数值的扩展
数值的扩展 二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === ...
- 自学JavaScript第一天- JS 基础
自学JavaScript第一天- JS 基础 JS 写在哪里 注释 行内 js 内部 js 外部 js JS 基础语法 语句 大小写 代码块 折行 变量 声明 var .let.const 及作用域 ...
- 自学-ES6篇-数值的扩展
1.二进制和八进制表示法 ES6提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === 503 ...
- Javascript 教程/速成/全面 /总结【含代码】
Javascript 速成 1.dom对象的属性方法 1.1 attribute (attr) 1.2document 1.3element 1.4event 鼠标事件 键盘事件 框架/对象(Fram ...
最新文章
- [Beta]第五次 Scrum Meeting
- EOS 智能合约源代码解读 (6)合约之action
- es elasticsearch 几种常见查询场景 二次分组 java读取es的查询json文件
- 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈
- 给大家介绍一下实现Go并发同步原语的基石
- .Net程序猿玩转Android开发---(11)页面跳转
- 如何将本地文件夹映射为硬盘盘符?
- 3dmax如何导入ies灯
- php面向对象编程的特性,什么是面向对象编程(OOP)?面向对象编程的特点
- 大一c语言课设之图书管理系统
- 轻便简洁的电脑录音软件,免费收藏!
- braft-editor 富文本编辑器在谷歌复制图片出现两张
- 5个好用的Excel技巧,一秒钟完成一个功能
- python账号怎么注销_登录后如何注销
- 【Chips】VLSI Final Project:小型卷积核单元设计 项目总结
- Plants vs. Zombies(二分)
- Java项目:基于Java药品管理系统(计算机毕业设计)
- GB/T 8323.2塑料 烟生成 第2 部分:单室法测定烟密度试验方
- 更好的包管理器——pnpm
- 软考证书=获得职称?软考证书还能这样用