首页 > 其他分享 >解决js计算0.1时不准确问题

解决js计算0.1时不准确问题

时间:2023-07-13 19:44:42浏览次数:47  
标签:r1 r2 0.1 arg1 arg2 js toString let 准确

const compute = {
  // 加法运算
  accAdd(arg1, arg2) {
    let r1;
    let r2;
    let m;
    let c;
    try {
      r1 = arg1.toString().split('.')[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = arg2.toString().split('.')[1].length;
    } catch (e) {
      r2 = 0;
    }
    c = Math.abs(r1 - r2);
    m = 10 ** Math.max(r1, r2);
    if (c > 0) {
      let cm = 10 ** c;
      if (r1 > r2) {
        arg1 = Number(arg1.toString().replace('.', ''));
        arg2 = Number(arg2.toString().replace('.', '')) * cm;
      } else {
        arg1 = Number(arg1.toString().replace('.', '')) * cm;
        arg2 = Number(arg2.toString().replace('.', ''));
      }
    } else {
      arg1 = Number(arg1.toString().replace('.', ''));
      arg2 = Number(arg2.toString().replace('.', ''));
    }
    return (arg1 + arg2) / m;
  },
  // 减法计算
  accSub(arg1, arg2) {
    let r1;
    let r2;
    let m;
    let n;
    try {
      r1 = arg1.toString().split('.')[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = arg2.toString().split('.')[1].length;
    } catch (e) {
      r2 = 0;
    }
    m = 10 ** Math.max(r1, r2); // last modify by deeka //动态控制精度长度
    n = r1 >= r2 ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
  },
  // 乘法运算
  accMul(arg1, arg2) {
    let m = 0;
    let s1 = arg1.toString();
    let 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('.', ''))) / 10 ** m;
  },
  // 除法运算
  accDiv(arg1, arg2) {
    let t1 = 0;
    let t2 = 0;
    let r1;
    let r2;
    try {
      t1 = arg1.toString().split('.')[1].length;
    } catch (e) {}
    try {
      t2 = arg2.toString().split('.')[1].length;
    } catch (e) {}
    r1 = Number(arg1.toString().replace('.', ''));
    r2 = Number(arg2.toString().replace('.', ''));
    return (r1 / r2) * 10 ** (t2 - t1);
  }
};

module.exports = compute;

  

标签:r1,r2,0.1,arg1,arg2,js,toString,let,准确
From: https://www.cnblogs.com/cs122/p/17551943.html

相关文章

  • js判断数据类型的四种方式
    1.typeof用法:typeof'123'==='string'缺点:只能判断基础数据类型(除null以外),如果是引用数据类型(如数组、函数、对象等)会返回Object因为typeof是直接在计算机里面基于二进制值进行检测的,也就是数据类型都是二进制值,对象存储在计算机中,二进制的值都是以000开头,而null值为000,所以......
  • js 原型链 & class
    https://es6.ruanyifeng.com/#docs/class 早期采用原型链写法functionA(){this.fx1=1}A.prototype.add=function(x){this.fx1+=1;console.log(x,this.fx1)}A.prototype.ts=function(x){console.log(x,this.fx1)this.add()c......
  • 使用nuxtjs静态部署时报错TypeError: renderContext.renderResourceHints is not a fu
    在使用nuxt框架进行静态打包部署时候每次总会有一两个界面报TypeError:renderContext.renderResourceHintsisnotafunction的错误 一开始以为是asyncData中获取的数据有问题,在各种排查后返现数据没问题,再次编译还是会有错误,最后甚至把asyncdata方法给删除掉都还是有这个错......
  • 发送请求忘记指定协议方式,日志com.jcraft.jsch.JSchException: java.net.ConnectExcep
      2023-07-1319:06:51.487-ERROR17629---[http-nio-192.168.2.206-36093-exec-8]c.t.b.p.b.c.common.util.sftp.SftpPool:com.jcraft.jsch.JSchException:java.net.ConnectException:拒绝连接(Connectionrefused)_atcom.jcraft.jsch.Util.createSocket(......
  • 一些js高阶函数的封装及常用优化技巧
    函数防抖//频繁触发、耗时操作,只执行最后一次constdebounce=function(fn,delay=300){lettimer=nullreturnfunction(...args){clearTimeout(timer)timer=setTimeout(()=>{fn.apply(this,args)},delay)}}//constdebounc......
  • js的arguments到底是什么?
    js的arguments到底是什么?类数组对象:arguments众所周知,js是一门相当灵活的语言。当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的东西里面,那么这到底是什么东西?在js中万物皆对象,甚至数组字符串函数都......
  • 【漏洞复现】用友NC uapjs RCE漏洞(CNVD-C-2023-76801)
    产品介绍    用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。漏洞概述     用友NC及NCCloud系统存在任意文件上......
  • 使用cropperjs进行头像的上传裁剪
    1.引入依赖npminstallcropperjs2.使用import'cropperjs/dist/cropper.css';importCropperfrom'cropperjs';3.页面及样式,这边我是参考这位up主的(https://blog.csdn.net/weixin_41897680/article/details/123606376),不过这位up主是使用的vue3,我将他修改成了vue2的语......
  • Oracle EBS - How Are Shipping Dates Calculated? (Doc ID 1076040.1)
    OracleShippingExecution-Version11.5.10.2to12.2.10[Release11.5.10to12.2]Informationinthisdocumentappliestoanyplatform.<br* ***GOALHowdoesE-BusinessSuite(EBS)derivetheMaterialTransactionDate?WhatisthepurposeoftheIniti......
  • 求js数组最大值
    1letarr=[1,2,3,4,5]23letmax=arr.reduce((prev,cur)=>{4returnMath.max(prev,cur)5})67console.log(max)//expectedoutput:5 //找出数组中最大/小的数字constnumbers=[5,6,2,3,7];//使用Math.min/Math.max以及apply函数......