为什么会超过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");
}
}
}
}
}