javascript parseInt()不正确地解析带指数的数字文字

uxh89sit  于 2022-11-27  发布在  Java
关注(0)|答案(7)|浏览(150)

我刚刚注意到,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引擎也会发生同样的情况。

zf2sa74q

zf2sa74q1#

我认为原因是parseInt通过调用ToString将传递的值转换为字符串,ToString将返回"-3.67394039744206e-15",然后解析它,这样它将考虑-3并将其返回。
mdn documentation显示器
parseInt函数将其第一个参数转换为字符串,对其进行解析,然后返回整数或NaN

r8uurelv

r8uurelv2#

x1月0n1x日

parseInt函数需要一个字符串作为第一个参数。如果参数不是字符串,JavaScript将在后台调用toString方法。因此,表达式的计算如下:

(-3.67394039744206e-15).toString()
// "-3.67394039744206e-15"
parseInt("-3.67394039744206e-15")
// -3

-3.67394039744206e-15.toFixed(19) === -3.6739e-15

此表达式解析为:

  • 一元-运算符
  • 数字文字3.67394039744206e-15
  • .toFixed()--属性存取器、属性名称和函数调用

这里描述了解析数字文字的方法。有趣的是,+/-不是数字文字的一部分。因此,我们有:

// 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
wpx232ag

wpx232ag3#

如果已解析的字符串(去掉+/-符号)包含任何非基数数字(在您的情况下为10)的字符,则在此类字符丢弃那些无法识别的字符之前,将创建一个包含所有其他字符的子字符串。
-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));

注意:

  • 基数从10开始 *
  • 如果第一个字符是'0',则切换为基数8。*
  • 如果下一个字符是'x',则转换为基数16。*
bpzcxfmw

bpzcxfmw4#

它试图将字符串解析为整数。我怀疑你的浮点数首先被转换为字符串。然后它不解析整个值,然后四舍五入,而是使用一个字符一个字符的解析函数,当它到达第一个小数点时会停止,忽略任何小数位或指数。
此处的一些示例http://www.w3schools.com/jsref/jsref_parseint.asp

ar7v8xwq

ar7v8xwq5#

parseInt用于解析字符串而不是数字:
函数的作用是:解析一个字符串参数,并返回一个指定基数的整数。
并且parseInt调用函数ToString,其中所有非数字字符被忽略。
您可以使用Math.round,它也可以解析字符串,并且 * 将数字四舍五入为最接近的整数 *:

Math.round("12.2e-2") === 0 //true
uttx8gqw

uttx8gqw6#

Math.round("12.2e-2")可能会根据值向上或向下舍入。因此可能会导致问题。
new Number("3.2343e-10").toFixed(0)可以解决此问题。

gfttwv5a

gfttwv5a7#

看起来您尝试使用parseFloat进行计算,这将为您提供正确答案。
parseInt如它所说,返回int,但parseFloat返回一个浮点数或指数:

parseInt(-3.67394039744206e-15) = -3
    parseFloat(-3.67394039744206e-15) = -3.67394039744206e-15
console.log('parseInt(-3.67394039744206e-15) = ' , parseInt(-3.67394039744206e-15));
console.log('parseFloat(-3.67394039744206e-15) = ',parseFloat(-3.67394039744206e-15));

相关问题