我读过一篇关于JavaScript parseInt的文章,其中有这样一个问题:
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为什么会发生这种情况?
发布于 2021-10-18 09:18:25
我在ecmascript standard上搜索了一下,看到了这个:
第一步是converting the input to `string` if it is not
19.2.5 parseInt (字符串,基数)
parseInt函数是%parseInt%内部对象。调用parseInt函数时,将执行以下步骤:
Let inputString be ? ToString(string)...。
因此,我使用String函数检查了基于字符串的值,以查看每个值的输出:
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将被丢弃。
发布于 2022-02-01 14:05:12
(这更像是一个冗长的评论,而不是一个相互竞争的答案。)
仅当将值作为数字类型传递给parseInt时,才会发生导致这种奇怪效果的不必要的转换-在这种情况下,编译器(或解释器或任何驱动JS的东西)会自动为您将数字转换为字符串,因为字符串类型是函数参数的预期类型
不幸的是,数字到字符串的转换函数更倾向于工程数字格式,否则它会变得太长。
此外,转换可能会导致精度损失,这是每个程序员在处理小数(非整数)时都必须注意的问题。
如果您记得自己将要解析的值放入一个字符串中,那么您就不会得到如此意想不到的结果:
let n = '0.0000005';
console.log(parseInt(n))将根据需要打印0。
吸取的经验教训:
parseInt和类似的函数,这些函数不会让您知道要解析的字符串是否包含额外的非匹配数据。例如,整型解析"x“或"1x”都应该告诉你这不是一个正确的整型数。在这一点上,parseInt通过忽略字符串中的额外数据和不告诉我们来表现出糟糕的行为。一个好的解析器函数要么告诉你它在哪里停止(这样你就可以检查是否有垃圾遗留下来),要么在发现意外数据时失败。发布于 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
https://stackoverflow.com/questions/69613606
复制相似问题