change_calculation.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //本js引入是为了浮点小数运算结果不精确bug的办法,来源: http://blog.csdn.net/yao_jing/article/details/50778011
  2. //除法函数,用来得到精确的除法结果
  3. //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
  4. //调用:accDiv(arg1,arg2)
  5. //返回值:arg1除以arg2的精确结果
  6. function accDiv(arg1,arg2){
  7. var t1=0,t2=0,r1,r2;
  8. try{t1=arg1.toString().split(".")[1].length}catch(e){}
  9. try{t2=arg2.toString().split(".")[1].length}catch(e){}
  10. with(Math){
  11. r1=Number(arg1.toString().replace(".",""));
  12. r2=Number(arg2.toString().replace(".",""));
  13. return (r1/r2)*pow(10,t2-t1);
  14. }
  15. }
  16. //给Number类型增加一个div方法,调用起来更加方便。
  17. Number.prototype.div = function (arg){
  18. return accDiv(this, arg);
  19. };
  20. //乘法函数,用来得到精确的乘法结果
  21. //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
  22. //调用:accMul(arg1,arg2)
  23. //返回值:arg1乘以arg2的精确结果
  24. function accMul(arg1,arg2)
  25. {
  26. var m=0,s1=arg1.toString(),s2=arg2.toString();
  27. try{m+=s1.split(".")[1].length}catch(e){}
  28. try{m+=s2.split(".")[1].length}catch(e){}
  29. return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
  30. }
  31. //给Number类型增加一个mul方法,调用起来更加方便。
  32. Number.prototype.mul = function (arg){
  33. return accMul(arg, this);
  34. };
  35. //加法函数,用来得到精确的加法结果
  36. //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
  37. //调用:accAdd(arg1,arg2)
  38. //返回值:arg1加上arg2的精确结果
  39. function accAdd(arg1,arg2){
  40. var r1,r2,m,c;
  41. try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  42. try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  43. c=Math.abs(r1-r2);
  44. m=Math.pow(10,Math.max(r1,r2));
  45. if(c>0){
  46. var cm=Math.pow(10,c);
  47. if(r1>r2){
  48. arg1=Number(arg1.toString().replace(".",""));
  49. arg2=Number(arg2.toString().replace(".",""))*cm;
  50. }else{
  51. arg1=Number(arg1.toString().replace(".",""))*cm;
  52. arg2=Number(arg2.toString().replace(".",""));
  53. }
  54. } else {
  55. arg1=Number(arg1.toString().replace(".",""));
  56. arg2=Number(arg2.toString().replace(".",""));
  57. }
  58. return (arg1+arg2)/m;
  59. //return (arg1*m+arg2*m)/m;
  60. }
  61. //给Number类型增加一个add方法,调用起来更加方便。
  62. Number.prototype.add = function (arg){
  63. return accAdd(arg,this);
  64. };
  65. //减法函数
  66. function accSub(arg1,arg2){
  67. var r1,r2,m,n;
  68. try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  69. try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  70. m=Math.pow(10,Math.max(r1,r2));
  71. //last modify by deeka
  72. //动态控制精度长度
  73. n=(r1>=r2)?r1:r2;
  74. return ((arg2*m-arg1*m)/m).toFixed(n);
  75. }
  76. ///给number类增加一个sub方法,调用起来更加方便
  77. Number.prototype.sub = function (arg){
  78. return accSub(arg,this);
  79. };