为什么parseInt(1/10000000)
的结果是1
,而parseInt(1/1000000)
的结果是0
?这与int i = -1/10000000;
在Java中的强制转换有些类似,其结果为0
。
我应该使用Math.floor
处理正数,使用Math.ceil
处理负数吗?还是有其他解决方案?
为什么parseInt(1/10000000)
的结果是1
,而parseInt(1/1000000)
的结果是0
?这与int i = -1/10000000;
在Java中的强制转换有些类似,其结果为0
。
我应该使用Math.floor
处理正数,使用Math.ceil
处理负数吗?还是有其他解决方案?
起初这个问题似乎很有趣。然后我看了一下 1/10000000
是什么。
< 1/10000000
> 1e-7
因此:
< parseInt("1e-7"); // note `parseInt` takes a STRING argument
> 1
如果你想将一个数截断为整数,可以这样做:
function truncateToInteger(real) {
return real - (real % 1);
}
parseInt(1/1000001)
是 9。 :) - PSLreturn real >> 0;
也可以很好地工作,但它仅限于32位数字,而return real - (real % 1);
支持任何浮点数。 - Niet the Dark AbsolparseInt
做的第一件事情就是调用第一个参数的 toString
方法(规范),而 parseFloat
、toFixed
和 toPrecision
则不会这样做。 - adeneoparseInt函数期望解析一个字符串参数,因此首先将其转换为字符串。
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