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

相关推荐
花随叶落几秒前
JavaScript的学习之DOM的查询(一)
前端·javascript·学习
DieSnowK12 分钟前
[C++][设计模式][备忘录模式]详细讲解
开发语言·c++·设计模式·重构·面向对象·备忘录模式·新手向
念晚91722 分钟前
Linux各种命令——tac命令,more 命令, less命令,head命令,tail命令,file 命令, stat 命令
linux·运维·服务器·前端·网络·数据库·less
左手の明天26 分钟前
【Python网络爬虫案例】python爬虫之模拟登录
开发语言·爬虫·python·模拟登录
攻城狮方叔1 小时前
共有5部手机,如果通过服务器让1号手机执行打开 “闲鱼.js“ 脚本
服务器·javascript·vscode
mumu_wangwei1 小时前
【PHP】实现类的无缝动态扩展,设计模式,php工厂模式应用场景,以下代码是工厂模式在框架设计中的真实使用案例代码
开发语言·设计模式·php
追风的木木1 小时前
vue 组件el-tree添加结构指示线条
前端·javascript·vue.js
Sca_杰1 小时前
vue使用glide.js实现轮播图(可直接复制使用)
javascript·vue.js·glide
nenye2331 小时前
vue-cli 搭建项目,ElementUI的搭建和使用
前端·javascript·vue.js
snows_l1 小时前
基于 elementUI / elementUI plus,实现 主要色(主题色)的一件换色(换肤)
前端·javascript·elementui