函数parseInt(1/10000000)返回值为1。为什���?

6

为什么parseInt(1/10000000)的结果是1,而parseInt(1/1000000)的结果是0?这与int i = -1/10000000;在Java中的强制转换有些类似,其结果为0

我应该使用Math.floor处理正数,使用Math.ceil处理负数吗?还是有其他解决方案?


那么 raddix 参数怎么样?它会产生相同的结果吗? - Tim Vermaelen
1
因为1/10000000返回1e-7,而1/1000000返回0.000001。这取决于parseInt的实际工作方式... - FrEaKmAn
1
@TimVermaelen 同样的结果。 - Aleksandar Toplek
这是因为结果是浮点数而不是整数。parseFloat(1/10000000) ~ 1e-7 - Edward J Beckett
2个回答

10

起初这个问题似乎很有趣。然后我看了一下 1/10000000 是什么。

< 1/10000000
> 1e-7

因此:

< parseInt("1e-7"); // note `parseInt` takes a STRING argument
> 1

如果你想将一个数截断为整数,可以这样做:

function truncateToInteger(real) {
    return real - (real % 1);
}

5
是的,更有趣的是 parseInt(1/1000001) 是 9。 :) - PSL
1
这里有一个“提前预告”的评论,虽然return real >> 0;也可以很好地工作,但它仅限于32位数字,而return real - (real % 1);支持任何浮点数。 - Niet the Dark Absol
而且有趣的是,parseInt 做的第一件事情就是调用第一个参数的 toString 方法(规范),而 parseFloattoFixedtoPrecision 则不会这样做。 - adeneo
解析1/10000000会返回一个浮点数,而不是整数。parseFloat(1/10000000)可以正常工作。 - Edward J Beckett

6

parseInt函数期望解析一个字符串参数,因此首先将其转换为字符串。

1/1000000 转换为字符串后是 "0.000001",由于parseInt仅适用于整数,因此会忽略"."以及之后的内容,所以它读取的值是 0

1/10000000 太小了,将其转换为字符串时使用科学计数法 "1e-7",由于parseInt仅适用于整数,因此会忽略"e"以及之后的内容,所以它读取的值是 1

基本上,使用parseInt并不是你应该做的事情。

要将数字转换为整数,请与0进行或运算,因为JavaScript中的任何位运算都会将数字强制转换为32位int,而与0进行或运算不会改变该值:

>(-1/10000000)|0
0

>1234.56|0 // truncation
1234

>(2147483647+1)|0 // integer overflow
-2147483648

1
据我所知,x|0也是asm.js中整数类型的一种提示。只是一个有趣的事实。 - D-side

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接