js处理双精度误差

来源:互联网 发布:oracle数据库分页查询 编辑:程序博客网 时间:2024/05/18 02:21

浮点数误差产生的原因

eg:
0.1+0.2=?
0.1+0.2=0.3? 我门先来看一段JS. console.log(0.1+0.2); 输出为0.30000000000000004 其实对于浮点数的四则运算,几乎所有的编程语言都会累死京都误差的问题,只不过c++/java/c#这些语言中已经封装好了解决的办法,二javascript是一门若类型语言,从设计思想上就没有对浮点数有个严格的数据类型,所以京都误差的问题就显得格外突出。下面我们就分析一下为什么会有这个京都误差,以及怎样修复这个误差。
首先,我们要站在计算机的角度去思考0。1+0。2这个看似小儿科的问题。我们知道,能被计算机读懂的是二进制,而不是十进制,所以我们先把0.1和0.2转换成二进制看看:
0.1 => 0.0001100110011001…无限循环
0.2跟0.1一样无限循环

上面我们发现0.1和0.2转化为二进制之后,变成了一个无限循环的数字,这在现实生活中,无限循环我们可以理解,但计算机是不允许无限循环的,对于无限循环的小数,计算机会进行舍入处理。进行双精度浮点数的小数部分最多支持
52 位,所以两者相加之后得到这么一串
0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。

解决方法

知道了浮点数产生的原因了,那么怎么处理这个问题呢?

方法一:指定要保留的小数位数(0.1+0.2).toFixed(1) =
0.3;这个方法toFixed是进行四舍五入的也不是很精准,对于计算金额这种严谨的问题,不推荐使用,而且不通浏览器对toFixed的计算结果也存在差异。

方法二:把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法。

第三方转载

http://www.cnblogs.com/xinggood/p/6639022.html

原创粉丝点击