change_calculation.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. };
  80. //四舍五入或末尾加零,实现类似php的 sprintf("%.".decimal."f", val);
  81. // function roundnum(val,decimals){
  82. // if(val !== ''){
  83. // val = parseFloat(val);
  84. // if(decimals < 1){
  85. // val = (Math.round(val)).toString();
  86. // }else{
  87. // let num = val.toString();
  88. // if(num.lastIndexOf('.') == -1){
  89. // num += '.';
  90. // num += makezero(decimals);
  91. // val = num;
  92. // }else{
  93. // let valdecimals = num.split('.')[1].length;
  94. // if(parseInt(valdecimals) < parseInt(decimals)){
  95. // num += makezero(parseInt(decimals)-parseInt(valdecimals));
  96. // val = num;
  97. // }else if(parseInt(valdecimals) > parseInt(decimals)){
  98. // val = parseFloat(val) != 0 ? Math.round(val.mul(makemultiple(decimals))).div(makemultiple(decimals)) : makedecimalzero(decimals);
  99. // let num = val.toString();
  100. // if(num.lastIndexOf('.') == -1){
  101. // num += '.';
  102. // num += makezero(decimals);
  103. // val = num;
  104. // }else {
  105. // let valdecimals = num.split('.')[1].length;
  106. // if (parseInt(valdecimals) < parseInt(decimals)) {
  107. // num += makezero(parseInt(decimals) - parseInt(valdecimals));
  108. // val = num;
  109. // }
  110. // }
  111. // }
  112. // }
  113. // }
  114. // }
  115. // return val;
  116. // }
  117. //四舍五入
  118. function roundnum(val,decimals){
  119. if(val !== ''){
  120. val = parseFloat(val);
  121. if(decimals < 1){
  122. val = (Math.round(val)).toString();
  123. }else{
  124. let num = val.toString();
  125. if(num.lastIndexOf('.') == -1){
  126. // num += '.';
  127. // num += makezero(decimals);
  128. val = num;
  129. }else{
  130. let valdecimals = num.split('.')[1].length;
  131. if(parseInt(valdecimals) < parseInt(decimals)){
  132. // num += makezero(parseInt(decimals)-parseInt(valdecimals));
  133. val = num;
  134. }else if(parseInt(valdecimals) > parseInt(decimals)){
  135. val = parseFloat(val) != 0 ? Math.round(val.mul(makemultiple(decimals))).div(makemultiple(decimals)) : makedecimalzero(decimals);
  136. let num = val.toString();
  137. if(num.lastIndexOf('.') == -1){
  138. // num += '.';
  139. // num += makezero(decimals);
  140. val = num;
  141. }else {
  142. let valdecimals = num.split('.')[1].length;
  143. if (parseInt(valdecimals) < parseInt(decimals)) {
  144. // num += makezero(parseInt(decimals) - parseInt(valdecimals));
  145. val = num;
  146. }
  147. }
  148. }
  149. }
  150. }
  151. }
  152. return val;
  153. }
  154. //根据位数生成编号,3位-》001 ,5位-》00001
  155. function makenum(num){
  156. let arr = new Array(num);
  157. for(let i=0;i< num;i++){
  158. if(i != num-1){
  159. arr[i] = 0;
  160. }else{
  161. arr[i] = 1;
  162. }
  163. }
  164. return arr.join('');
  165. }
  166. //生成num位的0
  167. function makezero(num){
  168. let arr = new Array(num);
  169. for(let i=0;i< num;i++){
  170. arr[i] = 0;
  171. }
  172. return arr.join('');
  173. }
  174. //生成num小数位数的0.
  175. function makedecimalzero(num){
  176. if(num < 1){
  177. return '0';
  178. }else{
  179. return '0.'+makezero(num);
  180. }
  181. }
  182. //生成num位的10倍数
  183. function makemultiple(num){
  184. return Math.pow(10,parseInt(num));
  185. }