美文网首页
js加法、乘法精度缺失处理

js加法、乘法精度缺失处理

作者: 轩轩小王子 | 来源:发表于2023-04-11 13:08 被阅读0次

众所周知在前端开发中,存在精度丢失问题,既经典问题

let a = 0.1
let b = 0.2
console.log(a + b == 0.3) //返回false

首先,我们要站在计算机的角度思考 0.1 + 0.2 这个看似小儿科的问题。我们知道,能被计算机读懂的是二进制,而不是十进制,所以我们先把 0.1 和 0.2 转换成二进制看看:

0.1 => 0.0001 1001 1001 1001…(无限循环)

0.2 => 0.0011 0011 0011 0011…(无限循环)
上面我们发现0.1和0.2转化为二进制之后,变成了一个无限循环的数字,这在现实生活中,无限循环我们可以理解,但计算机是不允许无限循环的,对于无限循环的小数,计算机会进行舍入处理。进行双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 ,因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。

解决方法:

// 解决js加法精度缺失问题
  add(arg1, arg2) {
      arg1 = arg1.toString(), arg2 = arg2.toString();
      var arg1Arr = arg1.split("."), arg2Arr = arg2.split("."), d1 = arg1Arr.length == 2 ? arg1Arr[1] : "", d2 = arg2Arr.length == 2 ? arg2Arr[1] : "";
      var maxLen = Math.max(d1.length, d2.length);
      var m = Math.pow(10, maxLen);
      var result = Number(((arg1 * m + arg2 * m) / m).toFixed(maxLen));
      var d = arguments[2];
      return typeof d === "number" ? Number((result).toFixed(d)) : result;
}
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以 arg2的精确结果
function accMul(arg1,arg2){
  var m=0,s1=arg1.toString(),s2=arg2.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);
} 
// 给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function (arg){
  return accMul(arg, this);
}

相关文章

  • 高精度(加法&乘法&减法)

    高精度加法: 高精度乘法: 高精度减法:

  • 17-12-8版子

    高精度加法 高精度乘法 快速乘法 二分匹配 阶乘长度(Stirling公式) 并查集 树状数组 树状数组的逆序数 ...

  • 几个高精度模板

    模板来自洛谷及Acwing:Acwing洛谷 后续增加注释以及相关代码改进 高精度加法 高精度减法 高精度乘法 高...

  • 高精度数(大整数)乘法

    大整数乘法 上一期(高精度加法)今天我们来研讨一下高精度乘法。 题目描述:将两个大整数(最多100位)相乘,输出结...

  • 高精度乘法

    【例】高精度乘法。输入两个正整数,求它们的积。【算法分析】类似加法,可以用竖式求乘法。在做乘法运算时,同样也有进位...

  • ruoyi框架使用总结(一)

    1. 前后端返回longint数据精度缺失? 处理springboot 前后端精度问题?数据转换,长整型和时间格式...

  • bignumber.js 简单使用记录

    项目中涉及到 大数据金额的计算bignumber.js 用法加法 减法minus 同上 乘法 除法 divided...

  • js大数运算,浮点型运算,精度问题

    一、js大数运算 js大数运算的精度问题,以太坊最小单位精度限制是10的18次方,由于js代码处理超过16位的数字...

  • noip模板整理

    数论快速幂高精度加法减法乘法除法线性筛素数埃氏筛法 O(nlglgn)最大公约数(gcd)最小公倍数(lcm)扩展...

  • 第三章作业

    无符号的整数加法、乘法是mod2^32的加法、乘法; 证明: #include "stdafx.h" #inclu...

网友评论

      本文标题:js加法、乘法精度缺失处理

      本文链接:https://www.haomeiwen.com/subject/pabordtx.html