change_calculation.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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 === '' || val === null) {
  120. return '';
  121. }
  122. if(val !== ''){
  123. val = parseFloat(val);
  124. let _sign = (val < 0) ? -1 : 1;
  125. if(decimals < 1){
  126. val = (Math.round(val*_sign)/_sign).toString();
  127. }else{
  128. let num = val.toString();
  129. if(num.lastIndexOf('.') == -1){
  130. // num += '.';
  131. // num += makezero(decimals);
  132. val = num;
  133. }else{
  134. let valdecimals = num.split('.')[1].length;
  135. if(parseInt(valdecimals) < parseInt(decimals)){
  136. // num += makezero(parseInt(decimals)-parseInt(valdecimals));
  137. val = num;
  138. }else if(parseInt(valdecimals) > parseInt(decimals)){
  139. val = parseFloat(val) != 0 ? Math.round(val.mul(makemultiple(decimals)*_sign)).div(makemultiple(decimals)*_sign) : makedecimalzero(decimals);
  140. let num = val.toString();
  141. if(num.lastIndexOf('.') == -1){
  142. // num += '.';
  143. // num += makezero(decimals);
  144. val = num;
  145. }else {
  146. let valdecimals = num.split('.')[1].length;
  147. if (parseInt(valdecimals) < parseInt(decimals)) {
  148. // num += makezero(parseInt(decimals) - parseInt(valdecimals));
  149. val = num;
  150. }
  151. }
  152. }
  153. }
  154. }
  155. }
  156. return val;
  157. }
  158. //根据位数生成编号,3位-》001 ,5位-》00001
  159. function makenum(num){
  160. let arr = new Array(num);
  161. for(let i=0;i< num;i++){
  162. if(i != num-1){
  163. arr[i] = 0;
  164. }else{
  165. arr[i] = 1;
  166. }
  167. }
  168. return arr.join('');
  169. }
  170. //生成num位的0
  171. function makezero(num){
  172. let arr = new Array(num);
  173. for(let i=0;i< num;i++){
  174. arr[i] = 0;
  175. }
  176. return arr.join('');
  177. }
  178. //生成num小数位数的0.
  179. function makedecimalzero(num){
  180. if(num < 1){
  181. return '0';
  182. }else{
  183. return '0.'+makezero(num);
  184. }
  185. }
  186. //生成num位的10倍数
  187. function makemultiple(num){
  188. return Math.pow(10,parseInt(num));
  189. }