前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前端JS计算精度损失的问题

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

作者头像
码客说
发布2022-10-04 21:36:43
2.1K0
发布2022-10-04 21:36:43
举报
文章被收录于专栏:码客码客

前言

JS的计算是会损失精度的,比如

代码语言:javascript
复制
0.1+0.2 //0.30000000000000004
1.2-1 //0.19999999999999996
1.15*100 //114.99999999999999
1.2/0.2 //5.999999999999999

方式1

代码语言:javascript
复制
// 两个浮点数求和
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;
  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);
}

调用

代码语言:javascript
复制
num_add(0.1, 0.2);
num_subtract(1.2,1);
num_multiply(1.15, 100);
num_divide(1.2,0.2);

方式2-Math.js

JS地址

https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.0.0/math.min.js

页面引用

代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.0.0/math.min.js"></script>

方法

代码语言:javascript
复制
// 加
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)));
}

调用

代码语言:javascript
复制
num_add(0.1, 0.2);
num_subtract(1.2,1);
num_multiply(1.15, 100);
num_divide(1.2,0.2);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 方式1
  • 方式2-Math.js
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档