parseInt(0.0000001)返回1的bug


字数:577 阅读时长:2分钟 阅读:85

parseInt()JavaScript的内置函数,用于解析一个字符串,并返回一个整数。常规情况下,使用没有问题,但是如果用来处理很小的float浮点类型数据时,会出现bug。如:0.0000001、0.00000005这样的数。

parseInt函数

parseInt

  • 语法
1
parseInt(string, radix)
  • 参数
参数描述
string必需。要被解析的字符串。
radix可选。不传默认为0,表示要解析的数字的基数。该值介于 2 ~ 36 之间。

使用

  • 一般情况
1
2
3
4
5
6
7
8
9
10
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
  • 特殊情况
1
2
3
4
5
// 正常
console.log(parseInt(0.000001)) // 0

// bug
console.log(parseInt(0.0000001)) // 1

parseInt()float 数据 0.0000001 解析为 -> 1,这就很奇怪了?

原因

出现这种bug的原因大概有两种:

  1. parseInt()函数的第一个参数默认字符串,如果不是字符串可能在处理时会进行转换。像这种:
1
2
3
4
5
6
7
8
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,

1
console.log(parseInt('1e-7'))  // 1
  1. 当遇到极小的数(绝对值小于0.0000001),Js会自动转成指数形式,如:
1
2
3
4
5
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()函数来处理:

1
2
3
4
5
6
7
8
9
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。如下:

1
2
3
4
5
6
7
8
9
10
11
// 正常: 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

欢迎访问:天问博客

本文作者: Tiven
发布时间: 2022-01-06
最后更新: 2022-01-07
本文标题: parseInt(0.0000001)返回1的bug
本文链接: https://www.tiven.cn/p/5cf344dc/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
欢迎留言,提问 ^_^