admin管理员组文章数量:1530845
在进行数据计算时,小数也就是浮点数拥有不低的出场率。在常人看来,机器也就是计算机的数据运算是不会出错的,没错,计算机进行数据运算的确不会犯错,但小数运算的误差是免不了的。
来试一试。
在JS中写上console.log(0.3-0.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));
输出结果如下图:
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 中的浮点数精度误差。
版权声明:本文标题:浮点数运算误差解决 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1725724113a1038735.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论