在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