在js中使用parseInt
转换浮点数总有些时候会给你意想不到的惊喜,例如:
1 | parseInt(0.0000005); // => 5 |
解决办法:
使用Math.floor
代替parseInt
1 | Math.floor(0.0000005); // => 0 |
原理
让我们再次看一下 parseInt(numericalString) 第一个参数的作用:如果它不是字符串,则将其转换为字符串,然后进行解析,并返回解析后的整数。
这可能是第一个线索。
然后让我们尝试将浮点数手动转换为字符串表示形式:
1
2
3
4
5
6
7
8 String(0.5); // => '0.5'
String(0.05); // => '0.05'
String(0.005); // => '0.05'
String(0.0005); // => '0.005'
String(0.00005); // => '0.00005'
String(0.000005); // => '0.000005'
String(0.0000005); // => '5e-7'
显式转换为字符串的String(0.0000005)行为与其他浮点数不同:它是指数表示法的字符串表示形式!
第二个线索,当采用指数表示法解析为整数时,您将得到数字5:
1
2
3
4
5 parseInt(0.0000005); // => 5
// 类似于
parseInt(5e-7); // => 5
// 类似于
parseInt('5e-7'); // => 5
parseInt(‘5e-7’)考虑到第一个数字’5’,但跳过’e-7’。
谜团已揭开!因为parseInt()总是将其第一个参数转换为字符串,所以小于10 -6的浮点数将以指数表示法编写。然后parseInt()从float的指数表示法中提取整数!