导语:写下这篇文章的缘由是因为在项目过程中,碰到了一个使用JavaScript处理
UINT64
类型数字的坑。
与大部分现代编程语言(包括几乎所有的脚本语言)一样,JavaScript中的数字类型是基于 IEEE 754
标准来实现的,该标准通常也被称为“浮点数”。JavaScript使用的是“双精度”格式(即64位二进制)。
较小的数值
不仅仅是JavaScript,所有遵循 IEEE 754
规范的语言都会碰到如下问题:
0.1 + 0.2 === 0.3; // false
从数学角度来说,上面的条件判断结果应该是true,可实际上却为false。
这是因为,二进制浮点数中的 0.1 和 0.2 并不是十分精确,它们相加的结果并非刚好等于 0.3 ,而是一个比较接近的数字 0.30000000000000004, 所以条件判断的结果为false。
那么该如何处理这种语言上的缺陷呢?
最常见的方法是设置一个误差范围,通常称为“机器精度”(machine epsilon),对JavaScript的数字类型来说,这个值通常是2^-52(2.220446049250313e-16)。
从 ES6 开始,该值定义在Number.EPSILON中,我们可以直接拿来用,也可以为 ES6 之前的版本写polyfill:
if (!Number.EPSILON) {
N