我读过一篇关于JavaScript parseInt
的文章,其中有一个问题:
parseInt(0.5); // => 0
parseInt(0.05); // => 0
parseInt(0.005); // => 0
parseInt(0.0005); // => 0
parseInt(0.00005); // => 0
parseInt(0.000005); // => 0
parseInt(0.0000005); // => 5
为什么会这样?
我读过一篇关于JavaScript parseInt
的文章,其中有一个问题:
parseInt(0.5); // => 0
parseInt(0.05); // => 0
parseInt(0.005); // => 0
parseInt(0.0005); // => 0
parseInt(0.00005); // => 0
parseInt(0.000005); // => 0
parseInt(0.0000005); // => 5
为什么会这样?
我在ecmascript standard上搜索了一下,看到了这个:
第一步是converting the input to `string` if it is not
:
19.2.5 parseInt ( string, radix )
parseInt函数是%parseInt%内在对象.调用parseInt函数时,将执行以下步骤:
Let inputString be ? ToString(string).
- 我们走吧!TrimString(inputString,start).
...
因此,我使用String
函数判断了字符串上的值,以查看每个值的输出:
String(0.5); // => '0.5'
String(0.05); // => '0.05'
String(0.005); // => '0.005'
String(0.0005); // => '0.0005'
String(0.00005); // => '0.00005'
String(0.000005); // => '0.000005'
String(0.0000005); // => '5e-7'
所以,这意味着当我们使用parseInt(0.0000005)
时,它等于parseInt('5e-7')
,根据定义:
parseInt
可以解释only a leading portion of string as an integer value
;它忽略任何不能被解释为整数表示法一部分的代码单元,并且没有给出任何此类代码单元被忽略的指示.
所以答案只会返回5
,因为它是唯一一个非字符e
之前的数字,所以剩下的e-7
将被丢弃.