
2.6 数字
无论何时,当你使用任何编程语言处理数字时,你都需要了解该语言处理数字的一些特性。下面是你应该了解的有关JavaScript的数字的一些信息。
1.核心类型
在JavaScript中,只有一个数字类型。它是一个双精度的64位的number。下面我们将讨论它的局限性,以及一些推荐的解决方案。
2.十进制
对于熟悉其他语言的双精度/浮点数的读者来说,可能知道二进制浮点数不能正确映射到十进制数这个问题。一个关于JavaScript内置数字的简单且著名的示例如下。

提示:对于真正的十进制数据,请使用后面提到的big.js。
3.整数
由内置数字类型表示的整数限制是Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER。

在这种情况下,安全性指的是该值不能是存在舍入(round)误差的结果。
这些不安全的值在+1/-1(舍入)之后,会远离安全的值。任何加法或减法都会导致结果的舍入。

为了检查是否安全,你可以使用ES6的Number.isSafeInteger。

提示:JavaScript将会获得BigInt的支持,参考资料[4]将会帮助你了解BigInt。到现在为止,如果想要使用任意精度的整数,可以使用即将讲到的big.js。
4.big.js
无论何时,当你在金融计算上使用数学时(例如,增值税的计算,需要精确到分,以及附加费的计算等),请使用像big.js这样的第三方库。它们是专为下面两个目的设计的。
● 完美的十进制运算。
● 超出整数值的安全计算。
big.js的安装命令很简单,如下所示。

使用big.js的一个简单示例如下所示。

注意:不要将此库用于UI(User Interface,用户界面)或以性能为目的的运算,如图表、canvas画图等。
5.NaN
当一个被计算出来的数字不能表示为一个有效数字时,JavaScript会返回一个特殊的NaN值,一个典型的例子就是虚数。

注意:相等的检查不适用于NaN值,要使用Number.isNaN来代替,如下所示。

6.无穷
数字的边界值可以用静态的Number.MAX_VALUE和-Number.MAX_VALUE的值来表示。

超出边界但是精度没有改变的值都被限制在此范围内。

超出边界且精度已经改变的值,用Infinity或-Infinity表示,示例如下。

当然,这些特殊无限大的值,也会出现在一些运算中。

你可以手动使用Infinity值,或者像下面这样使用Number类的静态成员。

幸运的是,比较运算符<和>可以在Infinity值上正常工作。

7.最小值
在number中可表示的最小非零值可以用Number类的静态成员Number.MIN_VALUE来表示。

小于MIN_VALUE的值会被转换为0。

进一步总结:就像大于Number.MAX_VALUE的值会被限制为INFINITY一样,小于Number.MIN_VALUE的值会被限制为0。