导航

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

侧边栏
最新评论
广树
2024-12-03 22:10
@Chise Hachiroku:我是上周末下的单,今天到,要是今天下单目测要下周一到。
Chise Hachiroku
2024-12-03 21:53
@广树:好歹日本那里还比较快,英国已经不快了。
广树
2024-12-03 20:41
@Chise Hachiroku:确实怎么快怎么来,只不过这么多商品这么极端的包装还是头一回
Chise Hachiroku
2024-12-03 20:01
亚马逊不就是这样的嘛……价格其实都是单件运输的价格,发货的时候怎么快怎么来。
MADAO
2024-12-02 16:48
唉,只是我现在没有玩这种长对话的心态了。
正在攻略

logo_kai.jpg


PSN奖杯卡

PSN奖杯卡

赞助商广告

预防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字符串乘法

donate.png

1210 x 50(蓝底).png

cloudcone