JS的乘、除、加、减法结果会有误差,在两个浮点数相
乘的时候会⽐较明显
问题:
  37.5*5.5=206.08 (JS算出来是这样的⼀个结果,我四舍五⼊取两位⼩数)
  我先怀疑是四舍五⼊的问题,就直接⽤JS算了⼀个结果为:206.08499999999998
  怎么会这样,两个只有⼀位⼩数的数字相乘,怎么可能多出这么⼩数点出来。
  我Google了⼀下,发现原来这是浮点运算的⼀个bug。
  ⽐如:7*0.8 JavaScript算出来就是:5.6000000000000005
[csharp]
01. //乘法函数,⽤来得到精确的乘法结果
02. //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会⽐较明显。这个函数
返回较为精确的乘法结果。
03. //调⽤:accMul(arg1,arg2)
04. //返回值:arg1乘以arg2的精确结果
05.    function accMul(arg1,arg2)
06.    {
07.        var m=0,String(),String();
08. try
09.        {
10.            m+=s1.split(".")[1].length
11.
12.        }
13. catch(e)
14.        {}
15. try
16.        {
17.            m+=s2.split(".")[1].length
18.        }
19. catch(e)
20.        {}
21. return place(".",""))*place(".",""))/Math.pow(10,m)
22.    }
23.
24. //给Number类型增加⼀个mul⽅法,调⽤起来更加⽅便。
25.    Number.prototype.mul = function (arg)
26.    {
27. return accMul(arg, this);
28.    }
29.
30. //除法函数,⽤来得到精确的除法结果
31. //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会⽐较明显。这个函数
返回较为精确的除法结果。
32. //调⽤:accDiv(arg1,arg2)
33. //返回值:arg1除以arg2的精确结果
34.
35.    function accDiv(arg1,arg2)
36.    {
37.      var t1=0,t2=0,r1,r2;
38. try
39.      {
40.          String().split(".")[1].length
41.      }
42. catch(e)
43.      {}
44. try
45.      {
46.          String().split(".")[1].length
47.      }
48. catch(e)
49.      {}
50.      with(Math)
51.      {
52.          r1=String().replace(".",""))
53.          r2=String().replace(".",""))
54. return (r1/r2)*pow(10,t2-t1);
55.      }
56.    }
57.
96.
01.
23.
在你要⽤的地⽅包含这些函数,然后调⽤它来计算就可以了。
  ⽐如你要计算:7*0.8 ,则改成 (7).mul(8)
  其它运算类似,就可以得到⽐较精确的结果。
看了很多关于解决javacsript浮点计算BUG办法,这个算是⽐较不错的了。但最终发现,加法还是有BUG
accAdd(0.0192, 0.12965)计算出来的结果0.14884999999999998,仍然存在问题。经过冷凝改写JS后,完美解决加法问题。代码如下:
[csharp]
01. /**
02. * javascript calc
03. *
04. * 描述  :  JS浮点计算BUG屏蔽
05. * 创建⼈  :  冷凝
06. * 创建⽇期 :  2012-12-21更新,解决触发部分BUG
07. *
08. */
09.
10. function accDiv(arg1, arg2) {
11.
12.    var t1 = 0, t2 = 0, t3 = 0, r1, r2;
13.
14. try { t1 = String().split(".")[1].length } catch (e) { }
15.
16. try { t2 = String().split(".")[1].length } catch (e) { }
17.
18.    r1 = String().replace(".", ""))
19.
20.    r2 = String().replace(".", ""))
21.
22. if (r2 == 0)
23. return 0;
24.
25.    var result = String(r1 / r2);
26.
27. try { t3 = String().split(".")[1].length } catch (e) { }
28.
29.    var index = t2 - t1 - t3;
30.
31. if (index < 0) {
32.        result = place(".", "");
33.
34. while (result.length <= Math.abs(index)) {
35.            result = '0' + result;
36.        }
37.
38.        var start = result.substring(0, result.length + index);javascript说明
39.        var end = result.substring(result.length + index, result.length);
40.
41.        result = start + '.' + end;
42.
43. return Number(result);
44.    }
45. else if (index > 0) {
46.        result = place(".", "");
47.
48. while (result.length <= Math.abs(index)) {
49.            result += '0';
50.        }
51. return Number(result);
52.    }
53. else return place(".", ""));
54.
55. }
56.
57.
58. //给Number类型增加⼀个div⽅法,调⽤起来更加⽅便。
59.
60. Number.prototype.div = function (arg) {
61. /// <summary>
62. ///    除法
63. /// </summary>
64. return accDiv(this, arg);
65.
122.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。