parseInt()解析具有指数错误的数字文字

问题描述 投票:11回答:6

[我刚刚观察到,对于整数(包含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引擎中也会发生同样的情况。

javascript node.js numbers parseint
6个回答
16
投票

我认为原因是parseInt通过调用parseInt将传递的值转换为字符串,这将返回ToString,然后对其进行解析,因此它将考虑ToString并将返回它。

"-3.67394039744206e-15"

parseInt函数将其第一个参数转换为字符串,并返回整数或NaN


4
投票

-3

mdn documentation期望将字符串作为第一个参数。如果参数不是字符串,则JavaScript将在后台调用parseInt(-3.67394039744206e-15) === -3方法。因此,表达式的计算如下:

parseInt function

parseInt

此表达式被解析为:

  • toString
  • 数字文字(-3.67394039744206e-15).toString() // "-3.67394039744206e-15" parseInt("-3.67394039744206e-15") // -3
  • -3.67394039744206e-15.toFixed(19) === -3.6739e-15-属性访问器,属性名称和函数调用

数字文字的解析方式为Unary - operator。有趣的是,+/-不是数字文字的一部分。因此,我们有:

-

类似于3.67394039744206e-15

.toFixed()

3
投票

如果已分析的字符串(带+/-号的字符串)包含不是基数的任何字符(在您的情况下为10),则将创建一个包含所有其他字符的子字符串,然后再丢弃这些无法识别的字符。

[在described here的情况下,转换开始并将基数确定为以10为底->转换一直进行到遇到'。”。在基数10中不是有效字符-因此,有效地发生了// property accessor has higher precedence than unary - operator 3.67394039744206e-15.toFixed(19) // "0.0000000000000036739" -"0.0000000000000036739" // -3.6739e-15 的转换,它给出了值3,然后应用了符号,因此为-3。

对于实现逻辑--3.67394039744206e-15.toFixed(2)

更多示例-

3.67394039744206e-15.toFixed(2)
// "0.00"
-"0.00"
// -0

要注意:

基数从10开始。

如果第一个字符为'0',它将切换为基数8。

如果下一个字符是'x',它将切换为以16为底。


1
投票

它试图将字符串解析为整数。我怀疑您的花车首先被铸成绳子。然后,它不分析整个值然后四舍五入,而是使用一个字符一个字符的解析函数,并且在到达第一个小数点时将停止,而忽略任何小数位或指数。

这里有一些例子-3.67394039744206e-15


0
投票

3的目的是解析字符串而不是数字:

parseInt()函数解析一个字符串参数并返回一个指定基数的整数(数学数字的底数系统)。

[http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.2.2调用函数alert(parseInt("2711e2", 16)); alert(parseInt("2711e2", 10));,其中所有非数字字符都将被忽略。

您可以使用http://www.w3schools.com/jsref/jsref_parseint.asp,它也分析字符串,并将数字四舍五入为最接近的整数

parseInt

0
投票

Math.round(“ 12.2e-2”)可以根据该值向上或向下取整。因此可能会导致问题。

new Number(“ 3.2343e-10”).toFixed(0)可以解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.