码迷,mamicode.com
首页 > Web开发 > 详细

关于JS数学计算误差的问题

时间:2015-06-18 13:21:53      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

在javaScript中,数学计算是一个很坑爹的问题,

  由于系统二进制转十进制的误差,导致浮点数的运算精度很不理想,经常会出现一些意想不到的问题。

  而js自动将小数转为科学计数法的问题,也让一些自己写数学插件的同学痛苦不已。

 

第一个,浮点数计算精度:

  比如:1.2*3 = 3.599999999....

  

  解决办法:

    ⑴将浮点数乘以10的n次幂化为整数,再进行计算,之后再除以10的n次幂,就可以得到我们想要的数值。即:1.2*3 = 12*3/10 = 3.6;(n为小数点后数位之和);

      至于多个浮点数的乘除,就不多说,算法一样。

     注:此方法还有一些计算有瑕疵,以前做过科学计算器貌似这个算法就有问题,但具体的太久我也记不起来了。但是这个方式处理一般的运算还是足够的。

 

    ⑵上一方法对于n<0的时候就显然不够用了,如:4.92/15=492/15*Math.pow(10,-2) = 0.329999999....(我们采用了第一种方法,但是却再次陷入原来的浮点计算中)

      所以更改移位方式势在必行。可以这样:

      将浮点数小数点向右移位,当浮点数全部化为整数时,去除小数点再进行计算。算出结果之后对结果进行小数点向左移n位;(n为小数点数位之和)

      注:这个方法的逻辑和上一方法其实是一样的,但是将后面的乘以10的n次幂计算,改为了字符串移位处理,让计算彻底脱离浮点计算的精度问题。

 

第二个,计算结果自动化为科学计数法

    其实这个也算不上是BUG,但是如果要对数据进行字符串处理的时候,就有些坑了。

 

最后有兴趣和需要的朋友可以去我的百度网盘下载下我做的js数学计算的包,虽然不大,但主要针对的是JavaScript中Math包计算会出现的计算误差的问题。

  里面有js的加减乘除基本运算(保证精度)、约分、公约数公倍数、数学表示法转换、取小数点位数、四舍五入的各种方法。有兴趣的可以去瞄一瞄

      网盘链接:http://pan.baidu.com/s/1hqCMToC  插件名:com.snowActivity.math.js

关于JS数学计算误差的问题

标签:

原文地址:http://www.cnblogs.com/lovetosleep/p/4585297.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!