123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- //本js引入是为了浮点小数运算结果不精确bug的办法,来源: http://blog.csdn.net/yao_jing/article/details/50778011
- //除法函数,用来得到精确的除法结果
- //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
- //调用:accDiv(arg1,arg2)
- //返回值:arg1除以arg2的精确结果
- function accDiv(arg1,arg2){
- var t1=0,t2=0,r1,r2;
- try{t1=arg1.toString().split(".")[1].length}catch(e){}
- try{t2=arg2.toString().split(".")[1].length}catch(e){}
- with(Math){
- r1=Number(arg1.toString().replace(".",""));
- r2=Number(arg2.toString().replace(".",""));
- return (r1/r2)*pow(10,t2-t1);
- }
- }
- //给Number类型增加一个div方法,调用起来更加方便。
- Number.prototype.div = function (arg){
- return accDiv(this, arg);
- };
- //乘法函数,用来得到精确的乘法结果
- //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
- //调用:accMul(arg1,arg2)
- //返回值:arg1乘以arg2的精确结果
- function accMul(arg1,arg2)
- {
- var m=0,s1=arg1.toString(),s2=arg2.toString();
- try{m+=s1.split(".")[1].length}catch(e){}
- try{m+=s2.split(".")[1].length}catch(e){}
- return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
- }
- //给Number类型增加一个mul方法,调用起来更加方便。
- Number.prototype.mul = function (arg){
- return accMul(arg, this);
- };
- //加法函数,用来得到精确的加法结果
- //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
- //调用:accAdd(arg1,arg2)
- //返回值:arg1加上arg2的精确结果
- function accAdd(arg1,arg2){
- var r1,r2,m,c;
- try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
- try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
- c=Math.abs(r1-r2);
- m=Math.pow(10,Math.max(r1,r2));
- if(c>0){
- var cm=Math.pow(10,c);
- if(r1>r2){
- arg1=Number(arg1.toString().replace(".",""));
- arg2=Number(arg2.toString().replace(".",""))*cm;
- }else{
- arg1=Number(arg1.toString().replace(".",""))*cm;
- arg2=Number(arg2.toString().replace(".",""));
- }
- } else {
- arg1=Number(arg1.toString().replace(".",""));
- arg2=Number(arg2.toString().replace(".",""));
- }
- return (arg1+arg2)/m;
- //return (arg1*m+arg2*m)/m;
- }
- //给Number类型增加一个add方法,调用起来更加方便。
- Number.prototype.add = function (arg){
- return accAdd(arg,this);
- };
- //减法函数
- function accSub(arg1,arg2){
- var r1,r2,m,n;
- try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
- try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
- m=Math.pow(10,Math.max(r1,r2));
- //last modify by deeka
- //动态控制精度长度
- n=(r1>=r2)?r1:r2;
- return ((arg2*m-arg1*m)/m).toFixed(n);
- }
- ///给number类增加一个sub方法,调用起来更加方便
- Number.prototype.sub = function (arg){
- return accSub(arg,this);
- };
- //四舍五入或末尾加零,实现类似php的 sprintf("%.".decimal."f", val);
- // function roundnum(val,decimals){
- // if(val !== ''){
- // val = parseFloat(val);
- // if(decimals < 1){
- // val = (Math.round(val)).toString();
- // }else{
- // let num = val.toString();
- // if(num.lastIndexOf('.') == -1){
- // num += '.';
- // num += makezero(decimals);
- // val = num;
- // }else{
- // let valdecimals = num.split('.')[1].length;
- // if(parseInt(valdecimals) < parseInt(decimals)){
- // num += makezero(parseInt(decimals)-parseInt(valdecimals));
- // val = num;
- // }else if(parseInt(valdecimals) > parseInt(decimals)){
- // val = parseFloat(val) != 0 ? Math.round(val.mul(makemultiple(decimals))).div(makemultiple(decimals)) : makedecimalzero(decimals);
- // let num = val.toString();
- // if(num.lastIndexOf('.') == -1){
- // num += '.';
- // num += makezero(decimals);
- // val = num;
- // }else {
- // let valdecimals = num.split('.')[1].length;
- // if (parseInt(valdecimals) < parseInt(decimals)) {
- // num += makezero(parseInt(decimals) - parseInt(valdecimals));
- // val = num;
- // }
- // }
- // }
- // }
- // }
- // }
- // return val;
- // }
- //四舍五入
- function roundnum(val,decimals){
- if (val === '' || val === null) {
- return '';
- }
- if(val !== ''){
- val = parseFloat(val);
- let _sign = (val < 0) ? -1 : 1;
- if(decimals < 1){
- val = (Math.round(val*_sign)/_sign).toString();
- }else{
- let num = val.toString();
- if(num.lastIndexOf('.') == -1){
- // num += '.';
- // num += makezero(decimals);
- val = num;
- }else{
- let valdecimals = num.split('.')[1].length;
- if(parseInt(valdecimals) < parseInt(decimals)){
- // num += makezero(parseInt(decimals)-parseInt(valdecimals));
- val = num;
- }else if(parseInt(valdecimals) > parseInt(decimals)){
- val = parseFloat(val) != 0 ? Math.round(val.mul(makemultiple(decimals)*_sign)).div(makemultiple(decimals)*_sign) : makedecimalzero(decimals);
- let num = val.toString();
- if(num.lastIndexOf('.') == -1){
- // num += '.';
- // num += makezero(decimals);
- val = num;
- }else {
- let valdecimals = num.split('.')[1].length;
- if (parseInt(valdecimals) < parseInt(decimals)) {
- // num += makezero(parseInt(decimals) - parseInt(valdecimals));
- val = num;
- }
- }
- }
- }
- }
- }
- return val;
- }
- //根据位数生成编号,3位-》001 ,5位-》00001
- function makenum(num){
- let arr = new Array(num);
- for(let i=0;i< num;i++){
- if(i != num-1){
- arr[i] = 0;
- }else{
- arr[i] = 1;
- }
- }
- return arr.join('');
- }
- //生成num位的0
- function makezero(num){
- let arr = new Array(num);
- for(let i=0;i< num;i++){
- arr[i] = 0;
- }
- return arr.join('');
- }
- //生成num小数位数的0.
- function makedecimalzero(num){
- if(num < 1){
- return '0';
- }else{
- return '0.'+makezero(num);
- }
- }
- //生成num位的10倍数
- function makemultiple(num){
- return Math.pow(10,parseInt(num));
- }
|