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,并将到达第一个小数点,将忽略任何小数位或指数停止。

这里有一些例子http://www.w3schools.com/jsref/jsref_parseint.asp