1.方法
/**
* 背景:js最大值是16位数(大于16位数的无法比较)
* 方法:数值大小比较(小于等于) -- 支持超过16位数(切记数值超过16位数一定要传字符串的数值,传number的数值会被系统转换,导致对比不了)
* @param num{string}: 要比较的数
* @param max{string}: 目标数
* @return boolean
**/
export function numberCompareIsLessThan(num, max) {
//是小于等于
let bool = true;
//校验”要比较的数“是不是一个数字,”要比较的数“一般是用户输入的,如果没有校验旧传入有可能不是数字,max是代码写的
let reg = /^(([0-9])|([1-9][0-9]*))(\.[0-9]+)?$/;
if(!reg.test(num)){
console.log('calcNumberIsLessThan-要比较的数不是一个数字:',num)
bool = false;
return bool;
}
num = num?num.toString():'';
max = max?max.toString():'';
//可能有小数
let numList = num.split(".");
let maxList = max.split(".");
//取”要比较的数“的int数值和小数数值
let numInt = numList[0]?numList[0]:'';
let numFloat = numList[1]?numList[1]:'';
//取”目标数“的int数值和小数数值
let maxInt = maxList[0]?maxList[0]:'';
let maxFloat = maxList[1]?maxList[1]:'';
//比较int长度
if(numInt.length > maxInt.length) {
bool = false;
}
if(numInt.length === maxInt.length) {
//int数值进行比较
for(let i = 0;i < maxInt.length; i++) {
let diff = (numInt[i]?numInt[i]:0) - (maxInt[i]?maxInt[i]:0);
if(diff > 0) {
bool = false;
break;
}
}
}
//如果前面int类型没有判断处理,判断小数点数值
if(bool){
let floatLength = Math.max(numFloat.length, maxFloat.length);
for(let j = 0;j < floatLength; j++) {
let diff = (numFloat[j]?numFloat[j]:0) - (maxFloat[j]?maxFloat[j]:0);
if(diff > 0) {
bool = false;
break;
}
}
}
return bool;
}
2.调用测试
//传字符串类型的数值过去
numberCompareIsLessThan("2231221","9223372036854775808")