浮点数运算误差解决

 

在进行数据计算时,小数也就是浮点数拥有不低的出场率。在常人看来,机器也就是计算机的数据运算是不会出错的,没错,计算机进行数据运算的确不会犯错,但小数运算的误差是免不了的。

来试一试。

在JS中写上console.log(0.3-0.1);输出到控制台

浮点数运算误差解决_第1张图片

是不是出乎意料,简单的0.3-0.1=0.2这样一道小学算术都没算对。

 

在对于浮点数的四则运算,几乎所有的编程语言都会有类似精度误差的问题。

 

只不过在 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题,而 JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出,无法避免。

 

那么为什么会有这个误差呢,误差有没有办法解决呢。

 

首先看计算机是怎么进行运算的。大家都知道计算机是二进制运算。那么要计算0.3减0.1,就要先进行换算。

console.log("0.3="+(0.3).toString(2));

console.log("0.1="+(0.1).toString(2));

console.log("0.3-0.1="+(0.3 - 0.1).toString(2));

输出结果如下图:

浮点数运算误差解决_第2张图片

 

0.3与0.1转换为二进制的浮点数都是无限循环小数。但由于浮点数精度有限被强行截断,所以转回十进制输出的数据会有误差。

那么如何解决这个问题。

 

最简单的解决方案就是给出明确的精度要求,在返回值的过程中,计算机会自动四舍五入。

console.log((0.3-0.1).toFixed(2));//输出的结果是0.20;

然而这样子解决有点勉强。

再看下面的方法

 

var s = Math.pow(10,8);

console.log((0.3 * s - 0.1 * s)/s);

输出后结果为0.2,没有误差。为什么,上面是什么意思。

 

原来为了避免产生精度差异,我们要把需要计算的数字乘以 10 的 n 次幂,换算成计算机能够精确识别的整数,然后再除以 10 的 n 次幂,就能够得到准确的结果了。

大部分编程语言都是这样处理精度差异的,这里就借用过来处理一下 JS 中的浮点数精度误差。

你可能感兴趣的:(2019-6-9)