首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么JavaScript的parseInt(0.0000005)打印"5"?

为什么JavaScript的parseInt(0.0000005)打印"5"?
EN

Stack Overflow用户
提问于 2021-10-18 09:18:25
回答 3查看 20.7K关注 0票数 48

我读过一篇关于JavaScript parseInt的文章,其中有这样一个问题:

代码语言:javascript
复制
parseInt(0.5);      // => 0
parseInt(0.05);     // => 0
parseInt(0.005);    // => 0
parseInt(0.0005);   // => 0
parseInt(0.00005);  // => 0
parseInt(0.000005); // => 0

parseInt(0.0000005); // => 5

为什么会发生这种情况?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-18 09:18:25

我在ecmascript standard上搜索了一下,看到了这个:

第一步是converting the input to `string` if it is not

19.2.5 parseInt (字符串,基数)

parseInt函数是%parseInt%内部对象。调用parseInt函数时,将执行以下步骤:

  1. Let inputString be ? ToString(string).
  2. Let S be!TrimString(inputString,start)。

..。

因此,我使用String函数检查了基于字符串的值,以查看每个值的输出:

代码语言:javascript
复制
String(0.5);      // => '0.5'
String(0.05);     // => '0.05'
String(0.005);    // => '0.005'
String(0.0005);   // => '0.0005' 
String(0.00005);  // => '0.00005'
String(0.000005); // => '0.000005'

String(0.0000005); // => '5e-7'

因此,这意味着当我们使用parseInt(0.0000005)时,它等同于parseInt('5e-7'),并且基于以下定义:

parseInt可能会解释only a leading portion of string as an integer value;它会忽略不能解释为整数表示法一部分的任何代码单元,并且不会给出任何此类代码单元被忽略的指示。

因此,答案将返回5,因为它是除非字符e之外唯一的数字字符,因此其馀的e-7将被丢弃。

票数 87
EN

Stack Overflow用户

发布于 2022-02-01 14:05:12

(这更像是一个冗长的评论,而不是一个相互竞争的答案。)

仅当将值作为数字类型传递给parseInt时,才会发生导致这种奇怪效果的不必要的转换-在这种情况下,编译器(或解释器或任何驱动JS的东西)会自动为您将数字转换为字符串,因为字符串类型是函数参数的预期类型

不幸的是,数字到字符串的转换函数更倾向于工程数字格式,否则它会变得太长。

此外,转换可能会导致精度损失,这是每个程序员在处理小数(非整数)时都必须注意的问题。

如果您记得自己将要解析的值放入一个字符串中,那么您就不会得到如此意想不到的结果:

代码语言:javascript
复制
let n = '0.0000005';
console.log(parseInt(n))

将根据需要打印0。

吸取的经验教训:

  • 尽可能避免隐式类型转换。
  • 避免使用parseInt和类似的函数,这些函数不会让您知道要解析的字符串是否包含额外的非匹配数据。例如,整型解析"x“或"1x”都应该告诉你这不是一个正确的整型数。在这一点上,parseInt通过忽略字符串中的额外数据和不告诉我们来表现出糟糕的行为。一个好的解析器函数要么告诉你它在哪里停止(这样你就可以检查是否有垃圾遗留下来),要么在发现意外数据时失败。
票数 8
EN

Stack Overflow用户

发布于 2022-02-03 11:53:47

请尊重数据类型!

在Chrome控制台中:

parseInt("0.5");

0

parseInt("0.05");

0

parseInt("0.005");

0

parseInt("0.0005");

0

parseInt("0.00005");

0

parseInt("0.000005");

0

parseInt("0.0000005");

0

parseInt("0.00000005");

0

parseInt("0.000000005");

0

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69613606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档