资讯专栏INFORMATION COLUMN

为什么JavaScript里面0.1+0.2 === 0.3是false

nicercode / 3330人阅读

摘要:返回是,这是为什么呢我们知道浮点数计算是不精确的,上面的返回式实际上是这样的在的新规范加入了一个新的东西是在对象上面,新增一个极小的常量。根据规格,它表示与大于的最小浮点数之间的差。上面的代码为浮点数运算,部署了一个误差检查函数。

0.1+0.2 === 0.3 //返回是false, 这是为什么呢??

我们知道浮点数计算是不精确的,上面的返回式实际上是这样的:
0.1 + 0.2 = 0.30000000000000004

0.1 + 0.2 - 0.3 = 5.551115123125783e-17

5.551115123125783e-17.toFixed(20) = "0.00000000000000005551"

在JavaScript的新规范ES6加入了一个新的东西-->Number.EPSILON

Number.EPSILON是在Number对象上面,新增一个极小的常量。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。

对于 64 位浮点数(double)来说,大于 1 的最小浮点数相当于二进制的 1.00..001 ,小数点后面有连续 51 个零。这个值减去 1 之后,就等于 2 的-52 次方。
Number.EPSILON 实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。

引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。

好了,我们来解决上面的浮点数计算的问题:

Number.EPSILON 可以用来设置“能够接受的误差范围”。比如,误差范围设为 2 的-50 次方(即 Number.EPSILON * Math.pow(2, 2) ),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。

5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2) // true

因此, Number.EPSILON 的实质是一个可以接受的最小误差范围。

function withinErrorMargin (left, right) {
    return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
}

0.1 + 0.2 === 0.3 // false
withinErrorMargin(0.1 + 0.2, 0.3) // true

1.1 + 1.3 === 2.4 // false
withinErrorMargin(1.1 + 1.3, 2.4) // true

上面的代码为浮点数运算,部署了一个误差检查函数。

文章引用自ES6标准。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98934.html

相关文章

  • javascript0.1 + 0.2 != 0.3?

    摘要:按照的数字格式,整数有的范围是,而且只能表示有限个浮点数,能表示的个数为个。 0.1+0.2 等于0.3吗?相信拿着这条题目随便问一个高年级的小学生,他们都会毫不犹豫都回答:相等。是的,相等是正常的,这是常识。但是都说实践是检验真理的唯一标准,拿这道简单的算术题用javascript在chrome控制台试验一下: 结果令人大跌眼镜,在控制台输入0.1+0.2 == 0.3返回的结果竟然...

    ivydom 评论0 收藏0
  • 利用babel(AST)优雅地解决0.1+0.2!=0.3的问题

    摘要:因此利用以及语法树在代码构建过程中重写等符号,开发时直接以这样的形式编写代码,在构建过程中编译成,从而在开发人员无感知的情况下解决计算失精的问题,提升代码的可读性。 前言 你了解过0.1+0.2到底等于多少吗?那0.1+0.7,0.8-0.2呢? 类似于这种问题现在已经有了很多的解决方案,无论引入外部库或者是自己定义计算函数最终的目的都是利用函数去代替计算。例如一个涨跌幅百分比的一个...

    张巨伟 评论0 收藏0
  • JS数值

    摘要:由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。根据标准,位浮点数的指数部分的长度是个二进制位,意味着指数部分的最大值是的次方减。也就是说,位浮点数的指数部分的值最大为。 一 前言 这篇文章主要解决以下三个问题: 问题1:浮点数计算精确度的问题 0.1 + 0.2; //0.30000000000000004 0.1 + 0.2 === 0.3; // ...

    williamwen1986 评论0 收藏0
  • JS中如何理解浮点数?

    摘要:本文通过介绍的二进制存储标准来理解浮点数运算精度问题,和理解对象的等属性值是如何取值的,最后介绍了一些常用的浮点数精度运算解决方案。浮点数精度运算解决方案关于浮点数运算精度丢失的问题,不同场景可以有不同的解决方案。 本文由云+社区发表 相信大家在平常的 JavaScript 开发中,都有遇到过浮点数运算精度误差的问题,比如 console.log(0.1+0.2===0.3)// fa...

    bang590 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<