search

Home  >  Q&A  >  body text

为何 javascript 中 parseInt(0.0000001)==1?

parseInt(0.01) == 0?

阿神阿神2822 days ago410

reply all(3)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 15:21:07

    parseInt在匹配时,如果找到了以数字开头然后开始会匹配接下来的字符,直到找到不是数字的字符结束,然后输出匹配到的数字。它能识别八进制、十六进制等,但是不识别科学计数法,而parseFloat只识别十进制,还可以识别科学计数法。对于科学计数法,parseIntparseFloat会产生不同的输出:

    parseInt(0.0000001)-->1
    (因为0.0000001被转换成字符串时变成"1e-7",所以变成parseInt("1e-7"))
    
    parseInt("1e6")-->1
    
    parseFloat(0.0000001)-->0.0000001
    (0.0000001转换成字符串变为"1e-7",所以变为parseFloat("1e-7")-->0.0000001,不要试图alert那样你只会看到"1e-7")
    
    parseFloat("1e6")-->1000000
    

    对于小于 1e-6 的数值来说,toString 时会自动转换为科学计数法。

    js parseInt之0.0000001陷阱分析小结

    reply
    0
  • 阿神

    阿神2017-04-10 15:21:07

    精度不够,溢出取反就为正

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:21:07

    精简下@不写代码的码农 的答案

    parseInt(0.000001) --> parseInt("1e-6") --> 1
    
    parseInt(0.001) --> parseInt("0.001") --> 0
    
    1. paseInt首先调用参数的toString方法,JS中精度小于0.000001的数字会自动转化为科学计数的字符串(1e-6)。

    2. parseInt在匹配时,如果找到了以数字开头然后开始会匹配接下来的字符,直到找到不是数字的字符结束,然后输出匹配到的数字

    因此就有了以上的奇怪现象。话说一个语言怎么会有这样的问题,解决掉不是很简单么。

    reply
    0
  • Cancelreply