number
分类
- 常规数字:以 64 位格式的 IEEE 754 存储,也叫“双精度浮点数”(JS 只有双精度浮点数,因此,整数只是不带小数的浮点数)
- BigInt:表示任意长度的整数,一般用于超过安全整数(±253-1)范围的情况
赋值
- 常规:
let n = 1000000
- 语法糖:
let n = 1_000_000
ES2021 - 缩写:
let n = 1e6
计算
JS 的数学运算是安全的,即使除以 0 也不会发生错误,最坏的情况也只是会得到
NaN
整数
进行计算时,八进制和十六进制都会被转换为十进制
浮点数
必须包含一个小数点,小数点前面可以没有整数,但是后面必须要有至少一位数字
- 普通表示法:
let n = 0.1
- 科学计数法:
let n = 1.23e5
(表示 1.23*105)
在处理小数时避免相等性检查,要判断浮点数相等:
Math.abs(a - b) < Number.EPSILON
对数字调用方法
- 使用 2 个小数点:
123..toString()
因为一个小数点会被认为是小数而报错 - 使用括号:
(123).toString()
不精确
由于 IEEE-754 的问题,数字可能无法精确表示,如:
解决方法:
使用 toFixed(n)
对结果进行舍入到小数点后面 n 位,如:(7.06 + 0.81).toFixed(2) < 7.87
toFixed
四舍五入:
- 乘/除法可以减少误差,但不能完全消除误差:
所以最好借助第三方库来处理浮点数和大数的运算问题:big.js
,decimal.js
,bignumber.js
https://github.com/MikeMcl/big.js/wiki
另外:还有处理数学运算的库:math.js
特殊数值
Infinity
:正无穷,比任何数都大-Infinity
:负无穷,比任何数都小NaN
:error,不是数字,它是独一无二的,与它自身也不相等(NaN 是粘性的,任何对 NaN 的进一步数学运算都会返回 NaN,只有一个例外:NaN ** 0
结果为 1)
判断
判断是否为有限数值(常规有效的数字)
isFinite()
:如果参数是或者能转换为NaN
,Infinity
或者-Infinity
会返回 false,其他返回 trueNumber.isFinite()
:跟上面一样,但是不会进行类型转换ES6
判断是否为 NaN
isNaN()
:给定值能转换为NaN
则返回值为true
,否则为false
Number.isNaN()
:先校验是否为number
类型,再判断isNaN()
ES6
随机数
[min, max)
的随机数:Math.random() * (max - min) + min
[min, max]
的随机整数:Math.floor(Math.random() * (max - min + 1) + min)
常用
静态属性
Number.EPSILON
:两个数之间的最小间隔ES6Number.NaN
:非数字(全局有)Number.MAX_VALUE
:能表示的最大正数Number.MIN_VALUE
:能表示的最小正数Number.MAX_SAFE_INTEGER
:最大的安全整数 253 - 1ES6Number.MIN_SAFE_INTEGER
:最小的安全整数 -(253 - 1)ES6Number.POSITIVE_INFINITY
:正无穷,同 InfinityNumber.NEGATIVE_INFINITY
:负无穷,同 -Infinity
静态方法
Number.isInteger()
:是否是整数ES6Number.isSafeInteger()
:是否是安全整数,即属于(±253-1)范围内ES6Number.isNaN()
:判断是否是 NaN(全局有)ES6Number.isFinite()
:判断是否为有限数值,即排除那 3 个 特殊数值(全局有)ES6Number.parseInt()
:字符串转整数(全局有)ES6Number.parseFloat()
:字符串转浮点数(全局有)ES6
原型方法
toFixed ( digits )
:保留小数点后几位(四舍五入),digits:小数点后数字的个数。返回字符串toExponential ( digits )
:以指数形式返回该数字,digits:小数点后数字的个数。返回字符串toPrecision ( precision )
:保留几个有效数字,precision:有效数字的个数。返回字符串
bigintES2020
一种特殊的数字类型,它提供了对任意长度“整数”的支持
创建
- 整数字面量后面加 n:
1n
- 调用
BigInt()
:BigInt(1)
使用
- 可以像正常 number 一样进行运算,但是除法会直接舍弃小数部分
- 不能把 number 和 BigInt 进行混合运算,应该使用强制转换再进行运算,但是它们之间可以互相进行比较(严格等于时不相等)
- 不支持一元加法
- 布尔运算中,行为类似于 number