Tiven

Tiven

博观而约取,厚积而薄发

天问的个人网站(天问博客),专注于Node.js、Vue.js、React、Vite、Npm、Nginx等大前端技术。不断学习新技术,记录日常开发问题,持续分享coding,极客开源,共同进步。生命不息,奋斗不止... [ hexo blog ]

parseInt(0.0000001)返回1的bug


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

parseInt函数

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的原因大概有两种:

  1. 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
  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

欢迎访问:天问博客