0.1+0.2等于什么?为什么?
考点:
- 计算机浮点数运算规则
- 平时遇到问题,有没有深入挖掘的精神
解答:
说实话,这个问题确实在平时开发中有遇到过,先上一个图。
是不是特懵逼,简直令人无法容忍。为什么会出现这样的结果?问题出在哪?如何解决?
为什么会出现这样的结果?问题出在哪?
JavaScript使用Number类型表示数字(整数和浮点数),遵循IEEE 754标准,通过64位来表示一个数字。
通过图片具体看一下数字在内存中的表示:
图片说明:
第0位:符号位,0表示整数,1表示负数
第1位到第11位:存储指数部分
第12位到第63位:存储小数部分(即有效数字)
首先,计算机无法直接对十进制的数字进行运算,这是硬件物理特性决定的。这样运算就分成了两个部分:先按照IEEE 754转成相应的二进制,然后对阶运算
而,0.1和0.2转换成二进制后会无限循环,但是由于IEEE 754尾数位数的限制,需要将后面多余的位截掉。这样在进制之间的转换过程中精度已经损失。
So,0.1+0.2 !=0.3
如何解决?
- 将数字转成整数,计算完成后再转小数(优势:小巧 劣势:对大数支持不好)
- 三方库(1)Math.js:http://mathjs.org/(2)big.js:http://mikemcl.github.io/big.js