parseInt() 是 JavaScript
的内置函数,用于解析一个字符串
,并返回一个整数
。常规情况下,使用没有问题,但是如果用来处理很小的float
浮点类型数据时,会出现bug。如:0.0000001、0.00000005这样的数。
parseInt
- 语法
1 | parseInt(string, radix) |
- 参数
参数 | 描述 |
---|---|
string | 必需。要被解析的字符串。 |
radix | 可选。不传默认为0,表示要解析的数字的基数。该值介于 2 ~ 36 之间。 |
使用
- 一般情况
1 | console.log(parseInt('5')) // 5 |
- 特殊情况
1 | // 正常 |
parseInt()
把 float
数据 0.0000001
解析为 -> 1
,这就很奇怪了?
原因
出现这种bug的原因大概有两种:
parseInt()
函数的第一个参数默认字符串,如果不是字符串可能在处理时会进行转换。像这种:
1 | console.log(String(0.1)) // '0' |
而对于字符串 '1e-7'
,parseInt()函数会解析为1,
1 | console.log(parseInt('1e-7')) // 1 |
- 当遇到极小的数(绝对值小于
0.0000001
),Js会自动转成指数形式,如:
1 | console.log(0.0000001) // 1e-7 |
总结: parseInt()
总是将其第一个参数转换为字符串,所以小于10^-6
的浮点数将以指数
形式表示法编写。然后parseInt()
从float
的指数表示法中提取整数!
解决方案
如果是小于10^-6
的浮点数,可以使用Math.floor()
函数来处理:
1 | console.log(Math.floor(0.1)) // 0 |
这样就完美的解决了 parseInt(0.0000001) 返回 1
的问题。
举一反三
当遇到极大的值(绝对值大于9999999999999998
),parseInt()
函数也会出现bug。如下:
1 | // 正常: 15 个 9 |
欢迎访问:天问博客
本文作者: Tiven
发布时间: 2022-01-06
最后更新: 2023-03-02
本文标题: parseInt(0.0000001)返回1的bug
本文链接: https://www.tiven.cn/p/5cf344dc/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
发布时间: 2022-01-06
最后更新: 2023-03-02
本文标题: parseInt(0.0000001)返回1的bug
本文链接: https://www.tiven.cn/p/5cf344dc/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!