parseInt() 是 JavaScript
的内置函数,用于解析一个字符串
,并返回一个整数
。常规情况下,使用没有问题,但是如果用来处理很小的float
浮点类型数据时,会出现bug。如:0.0000001、0.00000005这样的数。
parseInt
- 语法
parseInt(string, radix)
- 参数
参数 | 描述 |
---|---|
string | 必需。要被解析的字符串。 |
radix | 可选。不传默认为0,表示要解析的数字的基数。该值介于 2 ~ 36 之间。 |
使用
- 一般情况
console.log(parseInt('5')) // 5
console.log(parseInt('-5')) // -5
console.log(parseInt('2022年')) // 2022
console.log(parseInt(0.1)) // 0
console.log(parseInt(0.01)) // 0
console.log(parseInt(0.001)) // 0
console.log(parseInt(0.0001)) // 0
console.log(parseInt(0.00001)) // 0
console.log(parseInt(0.000001)) // 0
- 特殊情况
// 正常
console.log(parseInt(0.000001)) // 0
// bug
console.log(parseInt(0.0000001)) // 1
parseInt()
把 float
数据 0.0000001
解析为 -> 1
,这就很奇怪了?
原因
出现这种bug的原因大概有两种:
parseInt()
函数的第一个参数默认字符串,如果不是字符串可能在处理时会进行转换。像这种:
console.log(String(0.1)) // '0'
console.log(String(0.01)) // '0'
console.log(String(0.001)) // '0'
console.log(String(0.0001)) // '0'
console.log(String(0.00001)) // '0'
console.log(String(0.000001)) // '0'
console.log(String(0.0000001)) // '1e-7'
而对于字符串 '1e-7'
,parseInt()函数会解析为1,
console.log(parseInt('1e-7')) // 1
- 当遇到极小的数(绝对值小于
0.0000001
),Js会自动转成指数形式,如:
console.log(0.0000001) // 1e-7
console.log(parseInt(1e-7)) // 1
console.log(parseInt('1e-7')) // 1
总结: parseInt()
总是将其第一个参数转换为字符串,所以小于10^-6
的浮点数将以指数
形式表示法编写。然后parseInt()
从float
的指数表示法中提取整数!
解决方案
如果是小于10^-6
的浮点数,可以使用Math.floor()
函数来处理:
console.log(Math.floor(0.1)) // 0
console.log(Math.floor(0.01)) // 0
console.log(Math.floor(0.001)) // 0
console.log(Math.floor(0.0001)) // 0
console.log(Math.floor(0.00001)) // 0
console.log(Math.floor(0.000001)) // 0
// 1e-7
console.log(Math.floor(0.0000001)) // 0
这样就完美的解决了 parseInt(0.0000001) 返回 1
的问题。
举一反三
当遇到极大的值(绝对值大于9999999999999998
),parseInt()
函数也会出现bug。如下:
// 正常: 15 个 9
console.log(999999999999999) // 999999999999999
console.log(parseInt(999999999999999)) // 999999999999999
// 正常:小于 9999999999999999
console.log(9999999999999998) // 9999999999999998
console.log(parseInt(9999999999999998)) // 9999999999999998
// 异常:16 个 9
console.log(9999999999999999) // 10000000000000000
console.log(parseInt(9999999999999999)) // 1
欢迎访问:天问博客