javascript中定义的var类型是弱类型,默认是String类型,在比较两个数字大小的时候默认比较的是两个字符串 在js中不能直接用">"、"<"来直接判断大小 比如,在比较10和2时,按数字做比较10是比2大,可是按默认的字符串比较时,第一位的1和第一位的2比较是2大,就会出现2比10大的现象。 所以在javascript中比较两个数字的大小时需要转换类型后再进行比较。 例如 : if(3>4) 要写成 if(eval(3)>eval(4)) var n=4; if(n>3)要写成 if(parseInt(n)>eval(3)) var n=4; if(3<n<5)要写成 if(eval(3)<parseInt(n)&&parseInt(n)<eval(5)) ———————————————— 一、JS中比较两个数字的大小分三种情况: 1、两个纯数字(Number)比较大小:正常的数学运算。 2、纯数字(Number)与字符串数字(String)比较大小:自动将字符串数字转为纯数字,然后进行纯数字间的比较 3、字符串数字(String)与字符串数字(String)比较大小:会根据第一个不同的字符的ASCII码进行比较 console.log( 21 > 3 ); // true console.log( '21' > 3 ); // true console.log( '21' > '3' ); // false console.log( Number('21') > Number('3') ); // true 所以,在比较数字大小时注意将字符串转换成数字再进行比较。 二、超长数字比较大小 // 在JS中会存在数字大小操作2的53次方时会精度丢失,末尾几位变成0的情况。 // JS数字安全长度16位及以下, console.log( '16位', 1234567891234567 ); // 1234567891234567 console.log( '17位', 12345678912345678 ); // 12345678912345678 console.log( '18位', 123456789123456789 ); // 123456789123456780 console.log( '19位', 1234567891234567891 ); // 1234567891234568000 // 精度丢失就会存在数字比较大小不准确的问题,比如: let a = '1234567891234567891'; let b = '1234567891234567899'; console.log( Number(a) < Number(b) ) // false // 超过16位的正整数比较大小的方法:先转成字符串再截取比较大小 if (a.length > b.length) { console.log('a > b'); } else if (a.length < b.length) { console.log('a < b'); } else { const a1 = a.substr(0, 16); const a2 = a.substr(16, a.length-16); const b1 = b.substr(0, 16); const b2 = b.substr(16, b.length-16); if (Number(a1) > Number(b1) || (Number(a1) === Number(b1) && Number(a2) > Number(b2))) { console.log('a > b'); } else if (Number(a1) < Number(b1) || (Number(a1) === Number(b1) && Number(a2) < Number(b2))) { console.log('a < b'); } else { console.log('a = b'); } } |
|