前端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);

相关推荐
故事不长丨2 分钟前
C#字典(Dictionary)全面解析:从基础用法到实战优化
开发语言·c#·wpf·哈希算法·字典·dictionary·键值对
前端snow3 分钟前
在手机端做个滚动效果
前端
webkubor15 分钟前
🧠 2025:AI 写代码越来越强,但我的项目返工却更多了
前端·机器学习·ai编程
Sun_小杰杰哇18 分钟前
Dayjs常用操作使用
开发语言·前端·javascript·typescript·vue·reactjs·anti-design-vue
戴维南21 分钟前
TypeScript 在项目中的实际解决的问题
前端
晴殇i22 分钟前
package.json 中的 dependencies 与 devDependencies:深度解析
前端·设计模式·前端框架
雒珣23 分钟前
Qt简单任务的多线程操作(无需创建类)
开发语言·qt
basestone24 分钟前
🚀 从重复 CRUD 到工程化封装:我是如何设计 useTableList 统一列表逻辑的
javascript·react.js·ant design
pas13626 分钟前
25-mini-vue fragment & Text
前端·javascript·vue.js
何贤30 分钟前
2025 年终回顾:25 岁,从“混吃等死”到别人眼中的“技术专家”
前端·程序员·年终总结