广树管理员
2025-11-21 19:57
@石樱灯笼:那就少子老龄化吧
作者:广树时间:2018-07-05 12:31:41分类:JavaScript
因为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"











