为什么parseInt(0.0000008)===8?


前言

  • 最近看到一篇博客: 这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已。上面介绍了挺多让人大开眼界,逼格满满的代码。其中有一句就是parseInt(0.0000008) === 8,结果返回的是true,这里我就详细解释下为什么parseInt(0.0000008)的结果等于8。

    从函数本身出发

  • 这个出乎意料的结果似乎和IEEE 754浮点数标准并没有关系,而是parseInt函数本身的原因,先来看几个用parseInt方法将字符串转换为数字的例子:

    1
    2
    3
    4
    5
    6
    parseInt(' 1 2323') // 1
    parseInt(' abc1abc2323') // NaN
    parseInt(' **1abc2323') // NaN
    parseInt(' 1abc2323') // 1
    parseInt(' 12.9999') // 12
    parseInt(" 0x11") // 17
  • 从中可以看出几条规则:
    1.字符串左边的空格会被忽略掉
    2.从左到右依次取数字字符串,如果最左边以非数字开头则返回NaN
    3.取到第一个数字字符后继续,直到取到一个非数字的字符截止(包括小数点),将这个时候得到的数字字符串转换为数字
    4.以’0x’开头的字符串会做特殊处理表示将后续的数字转换为16进制的整数

  • 到这里可能有人问,代码上传入的是数字类型0.0000008,为什么要分析如何转换字符串类型的参数。那是因为调用parseInt方法时,会隐式地将传入的数字类型用toString方法转换为字符串!而将0.0000008调用toString的结果会是”8e-7”,在javascript中,小于0.000001的浮点数会以科学计数法来表示,而这样的字符串参照上面的规则,自然得到的结果就是8了。

    结语

  • 综上所述用parseInt转换数字的时候坑还是有的,使用时要多加注意。而如果用Math的floor或者round方法则可以得到正常的结果0。

  • 参考资料:
    parseInt() doesn’t always correctly convert to integer