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小时内删除。
发表评论