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

相关推荐
念风零壹几秒前
AI 时代的前端技术:从系统编程到 JavaScript/TypeScript
前端·ai
2301_7634724619 分钟前
C++20概念(Concepts)入门指南
开发语言·c++·算法
光影少年36 分钟前
react的hooks防抖和节流是怎样做的
前端·javascript·react.js
小毛驴85040 分钟前
Vue 路由示例
前端·javascript·vue.js
TechWJ42 分钟前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
lly2024061 小时前
C++ 文件和流
开发语言
发现一只大呆瓜1 小时前
AI流式交互:SSE与WebSocket技术选型
前端·javascript·面试
m0_706653231 小时前
分布式系统安全通信
开发语言·c++·算法
寻寻觅觅☆2 小时前
东华OJ-基础题-104-A == B ?(C++)
开发语言·c++
lightqjx2 小时前
【C++】unordered系列的封装
开发语言·c++·stl·unordered系列