正在召唤神秘力量
导航

萌即是正义!时不时分享一些ACG活动记录与有趣代码的小站!

预防JS精度丢失之字符串除以n个0 与 整数数字用字符串相加 的解决方案

作者:广树·时间: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"


相关文章:JS大整数相乘与字符串乘以n个0 | 预防JS精度丢失 | JS字符串乘法

侧边栏
最新评论
广树
2024-03-19
@8:美樹君って、誰だ?
8
2024-03-19
超絶可愛い!美樹君!
广树
2024-03-18
@邹江:哈哈哈,是吧!
邹江
2024-03-18
咖啡上面的图案挺有特色的,忍不住拍一张炫到朋友圈。哈哈!
广树
2024-03-18
@老张博客:是啊!我是最后才把这份拿铁喝掉的,都凉了🤭
正在攻略

圣兽之王.jpg

传颂之物

PSN奖杯卡

PSN奖杯卡

赞助商广告