JavaScript计算精度问题解决方案

来源:互联网 发布:动画短片制作软件 编辑:程序博客网 时间:2024/06/04 19:03

先来看一个案列:


执行上述代码,在控制台显示的结果应该是多少呢?不少人大概会说,等于0.3啊。先不说对错,让我们来看下结果:


很明显,结果和预想的不一样。为什么会造成这个结果呢?其实对于浮点数的四则运算,几乎所有的编程语言都会有类似精度误差的问题,只不过在 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题,而 JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。下面就分析下为什么会有这个精度误差,以及怎样修复这个误差。

首先,我们要站在计算机的角度思考 0.1 + 0.2 这个看似小儿科的问题。我们知道,能被计算机读懂的是二进制,而不是十进制,所以我们先把 0.1 和 0.2 转换成二进制看看:

0.1 => 0.0001 1001 1001 1001…(无限循环)
0.2 => 0.0011 0011 0011 0011…(无限循环)

双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。

那如何解决我想得到的结果为0.3呢,有一个很简单的方法,是使用.toFixed()方法获取制定经度的数值,如:


得到的结果就是0.30,toFixed方法中的参数代表需要保留的小数位数。

但是这个方法不是一劳永逸的,所以就需要一个方法来帮助我们处理精度问题,下面是一个通过借鉴和参考相关资料写出来的方法:


执行得到的结果就是0.3了。

这个方法是什么意思呢?为了避免产生精度差异,我们要把需要计算的数字乘以 10 的 n 次幂(这里面的n依据计算式中的最多小数的位数),换算成计算机能够精确识别的整数,然后再除以 10 的 n 次幂,大部分编程语言都是这样处理精度差异的,我们就借用过来处理一下 JS 中的浮点数精度误差。


原创粉丝点击