广树
2024-12-03 22:10
@Chise Hachiroku:我是上周末下的单,今天到,要是今天下单目测要下周一到。
作者:广树时间:2018-07-05 12:31:41分类:JavaScript/jQuery/Vue
因为JavaScript精度丢失的问题,经常会出现一些骚操作,例如:
999900000000630000/1000000000000000000
返回结果:0.9999000000006301
迷之多了01
这时候换个角度思考,不用数学运算,改为字符串操作,比如上面的例子是除以18个0就是向前挪18位加个小数点。
那么直接丢代码:
function stringAddPoint(num,s){ var l = num.length;//获取字符串长度 var res = ''; if(l==(s+1)){ res = num; res = res.slice(0,1) + '.' + res.slice(1);; }else if(l<(s+1)){ var zero = ''; while(s - l !== zero.length){ zero = zero + '0'; } res = '0.'+zero+num; }else if(l>=(s+1)){ var a = l-s; res = num; res = res.slice(0,a) + '.' + res.slice(a); } //去多余的0 var res_ = res; for(var i=0;i<res_.length;i++){ if(res_[res_.length-1-i]=='0'){ res = res_.slice(0,res_.length-1-i); }else if(res_[res_.length-1-i]=='.'){ res = res_.slice(0,res_.length-1-i); break }else{ break } } return res; } stringAddPoint('999900000000630000',18) "0.99990000000063"
另外JS在大数字计算的时候也容易出现精度缺失,例如:
99999999999999999+5
返回结果:100000000000000000
同样这里也可以用字符串的方法进行相加,代码如下:
function sumStrings(a,b){ var res='', c=0; a = a.split(''); b = b.split(''); while (a.length || b.length || c){ c += ~~a.pop() + ~~b.pop(); res = c % 10 + res; c = c>9; } return res.replace(/^0+/,''); } sumStrings('99999999999999999','5') "100000000000000004"