为什么JS中0.1+0.2 != 0.3
为什么JS中0.1+0.2 != 0.3
在我曾经的一篇《 javascript入门教程 (2) 》中,讲到JS中数字运算时,我们提到过一个叫做
数字运算中的精度缺失的问题
,当时我们只是简单说了下,并未对其原因做了解。这篇文章,我就带着大家了解下JS运算中精度的缺失问题
。
首先我们先来看一个例子
console.log(0.1 + 0.2) // 结果是0.30000000000000004,而不是3
这里0.1 + 0.2 != 0.3
这个就是我们要解决的问题了。
要弄清这个问题的原因,首先我们需要了解下在计算机中数字是如何存储和运算的。在计算机中,数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的。在JS中数字采用的IEEE 754的双精度标准进行存储,我们可以无需知道他的存储形式,只需要简单的理解成就是存储一个数值所使用的二进制位数比较多而已,这样得到的数会更加精确。
这里为了简单直观,我们使用定点数来说明问题。在定点数中,如果我们以8位二进制来存储数字。
对于整数来说,十进制的35会被存储为:
00100011
其代表2^5 + 2^1 + 2^0
。
对于纯小数来说,十进制的0.375会被存储为:0.011
其代表1/2^2 + 1/2^3
=1/4 + 1/8 = 0.375
而对于像0.1这样的数值用二进制表示你就会发现无法整除,最后算下来会是 0.000110011....
由于存储空间有限,最后计算机会舍弃后面的数值,所以我们最后就只能得到一个近似值。在JS中采用的IEEE 754的双精度标准也是一样的道理,我们且不管这个标准下的存储方式跟定点数存储有何不同,单单在这一点上他们都是相同的,也就是存储空间有限,当出现这种无法整除的小数的时候就会取一个近似值,在js中如果这个近似值足够近似,那么js就会认为他就是那个值。(比较拗口,举个例子)
console.log(0.1000000000000001) // 0.1000000000000001 (中间14个0,会打印出它本身) console.log(0.10000000000000001) // 0.1 (中间15个0,js会认为这两个值足够接近,所以会显示0.1)
所以我们现在应该可以理解,就是说由于0.1转换成二进制时是无限循环的,所以在计算机中0.1只能存储成一个近似值。另外说一句,除了那些能表示成 x/2^n
的数可以被精确表示以外,其余小数都是以近似值得方式存在的。
在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的,在他们相加的时候,两个近似值进行了计算,导致最后得到的值是0.30000000000000004
,此时对于JS来说,其不够近似于0.3,于是就出现了0.1 + 0.2 != 0.3
这个现象。
当然,也并非所有的近似值相加都得不到正确的结果。有时两个近似值进行计算的时候,得到的值是在JS的近似范围内的,于是就可以得到正确答案。至于哪些值计算后能得到正确结果,哪些不能,我们也不需要去记。最好的方法就是我们想办法规避掉这类小数计算时的精度问题就好了。
那么最常用的方法就是将浮点数转化成整数计算。因为整数都是可以精确表示的。
方法也很简单,举个例子:
对于0.1 + 0.02 我们需要转化成 ( 10 + 2 ) / 1e2 对于0.1 * 0.02 我们则转化成 1 * 2 / 1e3
按照这个思路,写个简单的方法就好了。
另外就是如果你在学习前端的过程中有任何问题想要咨询,欢迎关注
LearnInPro的公众号
,在上面随时向我提问哦。
相关文章:
-
-
本文同时发表在 https://github.com/zhangyachen/zhangyachen.github.io/issues/134 之前... [阅读全文]
-
插入图像 从不同来源插入图像 设置图像的宽度和高度 将图片设置为网页背景 图文并茂的房屋装饰装修网页 ... [阅读全文]
-
REGEXP对象 JavaScript通过内置对象RegExp支持正则表达式,有两种方法实例化RegExp对象。 1.字面量 2.构造函数 字面量 ... [阅读全文]
-
一般互联网公司形成规模后,在技术上或多或少都有一些自己的基础组件。这些基础组件大体可以分为两类: 1.完全自研 2.二次开发 完全自研的一般前提是 ... [阅读全文]
-
scroll(),scrollTop(),scrollBy()无效问题的总结
· 使用的浏览器:Chrome(67.0.3396.87)/火狐(60.0.2)/IE(ie7和ie8),均为PC端。 · 代码... [阅读全文] -
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
下一篇: WebGL学习笔记(1)
推荐阅读
-
解决JavaScript中0.1+0.2不等于0.3问题
-
解决JavaScript中0.1+0.2不等于0.3问题
-
为什么JavaScript中0.1 + 0.2 != 0.3
-
JavaScript中为什么 0.1 + 0.2 != 0.3
-
为什么JS中0.1+0.2 != 0.3
-
如何解决JavaScript中0.1+0.2不等于0.3
-
js png图片(有含有透明)在IE6中为什么不透明了_javascript技巧
-
js png图片(有含有透明)在IE6中为什么不透明了_javascript技巧
-
javascript - 在js中嵌入php代码为什么在网页中不显示呢?
-
为什么JavaScript中0.1 + 0.2 != 0.3
发表评论