因为JavaScript精度丢失的问题,经常会出现一些骚操作,例如:

999900000000630000/1000000000000000000

返回结果:0.9999000000006301

迷之多了01

这时候换个角度思考,不用数学运算,改为字符串操作,比如上面的例子是除以18个0就是向前挪18位加个小数点。

那么直接丢代码:

  1. function stringAddPoint(num,s){
  2. var l = num.length;//获取字符串长度
  3. var res = '';
  4. if(l==(s+1)){
  5. res = num;
  6. res = res.slice(0,1) + '.' + res.slice(1);;
  7. }else if(l<(s+1)){
  8. var zero = '';
  9. while(s - l !== zero.length){
  10. zero = zero + '0';
  11. }
  12. res = '0.'+zero+num;
  13. }else if(l>=(s+1)){
  14. var a = l-s;
  15. res = num;
  16. res = res.slice(0,a) + '.' + res.slice(a);
  17. }
  18. //去多余的0
  19. var res_ = res;
  20. for(var i=0;i<res_.length;i++){
  21. if(res_[res_.length-1-i]=='0'){
  22. res = res_.slice(0,res_.length-1-i);
  23. }else if(res_[res_.length-1-i]=='.'){
  24. res = res_.slice(0,res_.length-1-i);
  25. break
  26. }else{
  27. break
  28. }
  29. }
  30. return res;
  31. }
  32.  
  33. stringAddPoint('999900000000630000',18)
  34. "0.99990000000063"

另外JS在大数字计算的时候也容易出现精度缺失,例如:

99999999999999999+5
返回结果:100000000000000000
同样这里也可以用字符串的方法进行相加,代码如下:

  1. function sumStrings(a,b){
  2. var res='', c=0;
  3. a = a.split('');
  4. b = b.split('');
  5. while (a.length || b.length || c){
  6. c += ~~a.pop() + ~~b.pop();
  7. res = c % 10 + res;
  8. c = c>9;
  9. }
  10. return res.replace(/^0+/,'');
  11. }
  12.  
  13. sumStrings('99999999999999999','5')
  14. "100000000000000004"


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