number

分类

  • 常规数字:以 64 位格式的 IEEE 754 存储,也叫“双精度浮点数”(JS 只有双精度浮点数,因此,整数只是不带小数的浮点数)
  • BigInt:表示任意长度的整数,一般用于超过安全整数(±253-1)范围的情况

赋值

  • 常规:let n = 1000000
  • 语法糖:let n = 1_000_000ES2021
  • 缩写:let n = 1e6

计算

JS 的数学运算是安全的,即使除以 0 也不会发生错误,最坏的情况也只是会得到 NaN

整数

进行计算时,八进制和十六进制都会被转换为十进制

  • 二进制:let n = 0b100B10ES6
  • 八进制:let n = 0o770O77ES6
  • 十进制:let n = 9
  • 十六进制:let n = 0xAF0XAF

浮点数

必须包含一个小数点,小数点前面可以没有整数,但是后面必须要有至少一位数字

  • 普通表示法:let n = 0.1
  • 科学计数法:let n = 1.23e5(表示 1.23*105

在处理小数时避免相等性检查,要判断浮点数相等:Math.abs(a - b) < Number.EPSILON

对数字调用方法

  • 使用 2 个小数点:123..toString() 因为一个小数点会被认为是小数而报错
  • 使用括号:(123).toString()

不精确

由于 IEEE-754 的问题,数字可能无法精确表示,如:

0.1 + 0.2 === 0.3 // false,因为 0.1 + 0.2 = 0.30000000000000004
7.06 + 0.81 < 7.87 // true,因为 7.06 + 0.81 = 7.869999999999999

解决方法:

使用 toFixed(n) 对结果进行舍入到小数点后面 n 位,如:(7.06 + 0.81).toFixed(2) < 7.87

  • toFixed 四舍五入:
6.35.toFixed (1) // '6.3' 因为 6.35 实际存放的值是偏小的: 6.35.toFixed(20) = 6.34999999999999964473
0.1.toFixed (20) // '0.10000000000000000555'
  • 乘/除法可以减少误差,但不能完全消除误差:
(0.1 * 10 + 0.2 * 10) / 10 // 0.3
(0.28 * 100 + 0.14 * 100) / 100 // 0.4200000000000001

所以最好借助第三方库来处理浮点数和大数的运算问题:big.jsdecimal.jsbignumber.js https://github.com/MikeMcl/big.js/wiki

另外:还有处理数学运算的库:math.js

特殊数值

  • Infinity:正无穷,比任何数都大
  • -Infinity:负无穷,比任何数都小
  • NaN:error,不是数字,它是独一无二的,与它自身也不相等(NaN 是粘性的,任何对 NaN 的进一步数学运算都会返回 NaN,只有一个例外:NaN ** 0 结果为 1)

判断

判断是否为有限数值(常规有效的数字)

  • isFinite():如果参数是或者能转换为 NaNInfinity 或者 -Infinity 会返回 false,其他返回 true
  • Number.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:两个数之间的最小间隔ES6
  • Number.NaN:非数字(全局有)
  • Number.MAX_VALUE:能表示的最大正数
  • Number.MIN_VALUE:能表示的最小正数
  • Number.MAX_SAFE_INTEGER:最大的安全整数 253 - 1ES6
  • Number.MIN_SAFE_INTEGER:最小的安全整数 -(253 - 1)ES6
  • Number.POSITIVE_INFINITY:正无穷,同 Infinity
  • Number.NEGATIVE_INFINITY:负无穷,同 -Infinity

静态方法

  • Number.isInteger():是否是整数ES6
  • Number.isSafeInteger():是否是安全整数,即属于(±253-1)范围内ES6
  • Number.isNaN():判断是否是 NaN(全局有)ES6
  • Number.isFinite():判断是否为有限数值,即排除那 3 个 特殊数值(全局有)ES6
  • Number.parseInt():字符串转整数(全局有)ES6
  • Number.parseFloat():字符串转浮点数(全局有)ES6

原型方法

  • toFixed ( digits ):保留小数点后几位(四舍五入),digits:小数点后数字的个数。返回字符串
  • toExponential ( digits ):以指数形式返回该数字,digits:小数点后数字的个数。返回字符串
  • toPrecision ( precision ):保留几个有效数字,precision:有效数字的个数。返回字符串

bigintES2020

一种特殊的数字类型,它提供了对任意长度“整数”的支持

创建

  1. 整数字面量后面加 n:1n
  2. 调用 BigInt()BigInt(1)

使用

  • 可以像正常 number 一样进行运算,但是除法会直接舍弃小数部分
  • 不能把 number 和 BigInt 进行混合运算,应该使用强制转换再进行运算,但是它们之间可以互相进行比较(严格等于时不相等)
  • 不支持一元加法
  • 布尔运算中,行为类似于 number