前端JS计算精度损失的问题

例子:

0.1+0.2 //0.30000000000000004

1.2-1 //0.19999999999999996

1.15*100 //114.99999999999999

1.2/0.2 //5.999999999999999

方式1

复制代码
// 两个浮点数求和
function num_add(num1,num2){
  var r1,r2,m;
  try{
    r1 = num1.toString().split('.')[1].length;
  }catch(e){
    r1 = 0;
  }
  try{
    r2=num2.toString().split(".")[1].length;
  }catch(e){
    r2=0;
  }
  m=Math.pow(10,Math.max(r1,r2));
  return Math.round(num1*m+num2*m)/m;
}

// 两个浮点数相减
function num_subtract(num1,num2){
  var r1,r2,m,n;
  try{
    r1 = num1.toString().split('.')[1].length;
  }catch(e){
    r1 = 0;
  }
  try{
    r2=num2.toString().split(".")[1].length;
  }catch(e){
    r2=0;
  }
  m=Math.pow(10,Math.max(r1,r2));
  n=(r1>=r2)?r1:r2;
  return Number((Math.round(num1*m-num2*m)/m).toFixed(n));
}

// 两个浮点数相乘
function num_multiply(num1,num2){
  var m=0,s1=num1.toString(),s2=num2.toString(); 
  try{m+=s1.split(".")[1].length}catch(e){};
  try{m+=s2.split(".")[1].length}catch(e){};
  return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
}

// 两个浮点数相除
function num_divide(num1,num2){
  var t1,t2,r1,r2;
  try{
    t1 = num1.toString().split('.')[1].length;
  }catch(e){
    t1 = 0;
  }
  try{
    t2=num2.toString().split(".")[1].length;
  }catch(e){
    t2=0;
  }
  r1=Number(num1.toString().replace(".",""));
  r2=Number(num2.toString().replace(".",""));
  return (r1/r2)*Math.pow(10,t2-t1);
}

结果:

num_add(0.1, 0.2);

num_subtract(1.2,1);

num_multiply(1.15, 100);

num_divide(1.2,0.2);

方式2

引入 bignumber.js

复制代码
npm install bignumber.js

// 加
function num_add(num1, num2) {
  return Number(math.add(math.bignumber(num1), math.bignumber(num2)));
}

// 减
function num_subtract(num1, num2) {
  return Number(math.subtract(math.bignumber(num1), math.bignumber(num2)));
}

// 乘
function num_multiply(num1, num2) {
  return Number(math.multiply(math.bignumber(num1), math.bignumber(num2)));
}

// 除
function num_divide(num1, num2) {
  return Number(math.divide(math.bignumber(num1), math.bignumber(num2)));
}

结果:

num_add(0.1, 0.2);

num_subtract(1.2,1);

num_multiply(1.15, 100);

num_divide(1.2,0.2);

相关推荐
Never_Satisfied5 小时前
在JavaScript / HTML中,div容器在内容过多时不显示超出的部分
开发语言·javascript·html
鬼谷中妖5 小时前
JavaScript 循环与对象:深入理解 for、for...in、for...of、不可枚举属性与可迭代对象
前端
大厂码农老A5 小时前
你打的日志,正在拖垮你的系统:从P4小白到P7专家都是怎么打日志的?
java·前端·后端
im_AMBER5 小时前
CSS 01【基础语法学习】
前端·css·笔记·学习
DokiDoki之父5 小时前
前端速通—CSS篇
前端·css
pixle05 小时前
Web大屏适配终极方案:vw/vh + flex + clamp() 完美组合
前端·大屏适配·vw/vh·clamp·终极方案·web大屏
ssf19875 小时前
前后端分离项目前端页面开发远程调试代理解决跨域问题方法
前端
@PHARAOH5 小时前
WHAT - 前端性能指标(加载性能指标)
前端
尘世中一位迷途小书童5 小时前
🎨 SCSS 高级用法完全指南:从入门到精通
前端·css·开源
非凡ghost5 小时前
火狐浏览器(Firefox)tete009 Firefox 多语便携版
前端·firefox