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"); } } } } }
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
C++综合练习——身份证