js中金额比较大小-超过Number最大值

为什么会超过Number最大值

公司是做银行柜面系统的,新系统前端页面组件使用的是vue,需要封装vue组件,完善公司组件库,其中有一个是金额文本框,组件需要有最大值属性,银行系统中金额数值会比较大,需考虑超过Number的情况。

Number类型最大值为9007199254740992,如果字符串中的值大于此值如果转换为Number会出现精度不准。

作为一个当时刚接触前端的新手,想出来的方式:

①先判断输入的是否是数值类型
②拿0为标准,排除 4 种情况
    1.两个都等于0
    2.一个大于0,一个等于0
    3.一个小于0,一个等于0
    4.一个大于0,一个小于0
③拆分整数位、小数位,分别比较

代码如下

    numberCompare(num1, num2) {
      num1 = num1 + "";
      num2 = num2 + "";
      let regNum = new RegExp(/^(\-|\+)?\d+(\.\d+)?$/);
      if (!regNum.test(num1) || !regNum.test(num2)) {
        throw new Error("参数类型错误,非金额类型");
      }
      //判断两数符号判断,基于 0 做初步比较,比较之后,只需要做同符号的判断
      let num1Symbol = Number(num1) >= 0 ? true : false;
      let num2Symbol = Number(num2) >= 0 ? true : false;
      if (num1Symbol === true && num2Symbol === false) {
        return "greater";
      }
      if (num1Symbol === false && num2Symbol === true) {
        return "less";
      }
      if (num1Symbol === true && num2Symbol === true) {
        if (Number(num1) > 0 && Number(num2) === 0) return "greater";
        if (Number(num1) === 0 && Number(num2) > 0) return "less";
        if (Number(num1) === 0 && Number(num2) === 0) return "equal";
      }

      //拆分整数小数位
      let num1Arr = num1.split(".");
      let num2Arr = num2.split(".");
      let num1Integer = num1Arr[0].replace(/^0+/, "");
      let num2Integer = num2Arr[0].replace(/^0+/, "");
      let num1Decimal = num1Arr[1] ? Number("0." + num1Arr[1]) : 0.0;
      let num2Decimal = num2Arr[1] ? Number("0." + num2Arr[1]) : 0.0;

      let getNeedRetResult = (symbol, oldResult) => {
        if (symbol === true || oldResult === "equal") {
          return oldResult;
        }
        if (oldResult === "greater") {
          return "less";
        }
        if (oldResult === "less") {
          return "greater";
        }
      };
      //整数位比较
      if (num1Integer.length > num2Integer.length) {
        return getNeedRetResult(num1Symbol, "greater");
      }
      if (num1Integer.length < num2Integer.length) {
        return getNeedRetResult(num1Symbol, "less");
      }
      if (num1Integer.length === num2Integer.length) {
        let num1IntegerSplit = num1Integer.split("");
        let num2IntegerSplit = num2Integer.split("");
        for (let i = 0; i < num1IntegerSplit.length; i++) {
          if (num1IntegerSplit[i] > num2IntegerSplit[i]) {
            return getNeedRetResult(num1Symbol, "greater");
          }
          if (num1IntegerSplit[i] < num2IntegerSplit[i]) {
            return getNeedRetResult(num1Symbol, "less");
          }
          if (
            num1IntegerSplit[i] === num2IntegerSplit[i] &&
            num1IntegerSplit.length - 1 === i
          ) {
            //比较小数位
            if (Number(num1Decimal) === Number(num2Decimal)) {
              return "equal";
            }
            if (Number(num1Decimal) > Number(num2Decimal)) {
              return getNeedRetResult(num1Symbol, "greater");
            }
            if (Number(num1Decimal) < Number(num2Decimal)) {
              return getNeedRetResult(num1Symbol, "less");
            }
          }
        }
      }
    }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值