JavaScript中的parseInt在传入浮点数时的行为

6
我有两个parseInt(),我不太确定为什么它们给了我不同的结果: alert(parseInt(0.00001)) 显示 0; alert(parseInt(0.00000001)) 显示 1
我的猜测是,由于parseInt需要字符串参数,它将 0.00001 视为 ""+0.00001,即 "0.00001",因此,在parseInt后第一个警报将显示 0。对于第二个语句,""+0.00000001 将成为 "1e-8",其parseInt将为 1。我是正确的吗?
谢谢

始终添加基数,parseInt(0.00001, 10) - adeneo
你的问题有些令人困惑。你先说第一个警报显示为 0.00001,然后又说它显示为 0。在我的设备上,它显示为 0 - Barmar
看起来你走在了正确的轨道上:String(0.00000001) --> "1e-8",而 parseInt("1e-8"); -> 1。 - Andrew
Barmar:你是对的,第一个警告显示为0。对此我很抱歉。 - AlliceSmash
一遍又一遍地,我看到人们错误地使用 parseInt(一个字符串解析函数)来四舍五入数字。这正是为什么你不应该这样做的典型例子! - Alnitak
1
@Alnitak:我并不想使用parseInt来进行舍入操作。我在阅读JQuery类型文档时注意到parseInt(0.000001)返回1,而我并没有理解其中原因。这就是为什么我试图使用不同的值来弄清楚它的原因。但还是感谢你指出这一点,让其他人也能意识到。 - AlliceSmash
3个回答

8

我相信你是正确的。

parseInt(0.00001) == parseInt(String(0.00001)) == parseInt('0.00001') ==> 0

parseInt(0.00000001) == parseInt(String(0.00000001)) == parseInt('1e-8') ==> 1

感谢确认! - AlliceSmash
请注意,0.00000001.toFixed(8)返回正确的字符串。 - adeneo
一个假设已经正确给出的问题不需要答案,只需要确认假设并结束评论。 - Alnitak

0

你是正确的。

parseInt旨在从字符串中获取数字。因此,如果您传递一个数字,它首先将其转换为字符串,然后再转换回数字。在字符串转换之后,parseInt从字符串中的第一个数字开始,并在遇到第一个非数字相关字符时放弃。所以"1.e-8"变成了"1"

如果您知道您从一个字符串开始,并且只想获取一个整数值,您可以这样做。

Math.round(Number('0.00000001')); // 0

如果您知道您有一个浮点数而不是字符串...

Math.round(0.00000001); // 0

你也可以对这个数字进行截断(truncate),向上取整(ceil())或向下取整(floor())。


0

parseInt 函数接受第一个参数(转换为字符串)中的每个被识别为数字的字符,并在找到非数字值时忽略该值和剩余的字符串。 (参见“描述”下的MDN第二段)

因此,parseInt(0.00000001) === parseInt(String(0.00000001)) === parseInt("1e-8") 很可能只会从字符串提取出 1 并返回 parseInt("1") === 1

不过还有另一种可能性:

来自 Mozilla 开发者网络: parseInt(string, radix);

对于字符串参数(强调添加):“要解析的值。如果 string 不是字符串,则将其转换为字符串。 字符串中的前导空格将被忽略。”

我认为这种可能性较小,因为 String(0.00000001) 并没有产生 NAN。


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