parseInt()不正确地parsing带有指数的数字文字
我刚刚观察到, parseInt
函数并不关心整数(包含e
字符的数字)的小数位数。
我们举个例子: -3.67394039744206e-15
> parseInt(-3.67394039744206e-15) -3 > -3.67394039744206e-15.toFixed(19) -3.6739e-15 > -3.67394039744206e-15.toFixed(2) -0 > Math.round(-3.67394039744206e-15) 0
我预计parseInt
也将返回0
。 什么事发生在较低的水平? 为什么parseInt
在这种情况下返回3
(从源代码中的一些片断将不胜感激)?
在这个例子中,我使用了node v0.12.1
,但我期望在浏览器和其他JavaScript引擎中node v0.12.1
发生这种情况。
我认为原因是parseInt
通过调用ToString
将传递的值转换为string,这将返回"-3.67394039744206e-15"
,然后parsing它,所以它会考虑-3
,并将返回它。
mdn文档
parseInt函数将其第一个参数转换为一个string,对其进行parsing并返回一个整数或NaN
parseInt(-3.67394039744206e-15) === -3
parseInt
函数需要一个string作为第一个参数。 如果参数不是string,JavaScript将在场景后面调用toString
方法。 所以expression式评估如下:
(-3.67394039744206e-15).toString() // "-3.67394039744206e-15" parseInt("-3.67394039744206e-15") // -3
-3.67394039744206e-15.toFixed(19) === -3.6739e-15
这个expression式被parsing为:
- 一元
-
运营商 - 数字字面意思是
3.67394039744206e-15
-
.toFixed()
– 属性访问器,属性名称和函数调用
这里描述了数字字面parsing的方式。 有趣的是, +/-不是数字文字的一部分 。 所以我们有:
// property accessor has higher precedence than unary - operator 3.67394039744206e-15.toFixed(19) // "0.0000000000000036739" -"0.0000000000000036739" // -3.6739e-15
同样为-3.67394039744206e-15.toFixed(2)
:
3.67394039744206e-15.toFixed(2) // "0.00" -"0.00" // -0
如果parsing后的string(剥离+/-符号)包含任何不是小数位的字符(在本例中为10),则创build包含所有其他字符的子string,然后丢弃这些无法识别的字符。
在-3.67394039744206e-15
的情况下,转换开始并且基数被确定为基数10 – >转换发生直到遇到'。' 这不是基数10中的有效字符 – 因此,有效地,转换发生在3
,其给出值3,然后应用符号,从而-3。
对于实现逻辑 – http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.2.2
更多示例 –
alert(parseInt("2711e2", 16)); alert(parseInt("2711e2", 10));
它试图将stringparsing为整数。 我的怀疑是你的花车首先被铸造成弦乐。 然后,而不是parsing整个值,然后四舍五入,它使用字符的字符parsingfunction,并将到达第一个小数点,将忽略任何小数位或指数停止。