预防JS精度丢失之字符串除以n个0 与 整数数字用字符串相加 的解决方案
作者:广树 | 时间:2018-7-5 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"
赞一个1
发表评论: