Js 中 parseInt(0.0000008) 等于 8

2018-03-28 22:18:34 +08:00
 oska117

今天遇到个问题,发现 js 中一些注意的地方

parseInt(0.000008) 结果为 0

parseInt(0.0000008) 结果为 8

parseInt("0.0000008") 结果为 0

第二个感觉好奇怪,就在网上搜, 结果在阮一峰的《 js 标准参考手册》发现

“对于那些会自动转为科学计数法的数字,parseInt 会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。”

也就是说,0.0000008 会先自动转换为 科学计数法 8e-7, 然后自动转为字符串 “ 8e-7 ”,结果就是 8 了

4079 次点击
所在节点    程序员
12 条回复
songz
2018-03-28 22:44:21 +08:00
先套个 floor 就没有意外了
rock_cloud
2018-03-28 22:50:54 +08:00
怎么感觉像是 bug。。。
huweitxdy
2018-03-28 23:03:26 +08:00
ecma 规范里似乎就是这么写的。。。
owwlo
2018-03-28 23:09:24 +08:00
踩坑留念
mchl
2018-03-28 23:13:39 +08:00
第一反应是试一下 parseInt(Number(0.0000008) )
oska117
2018-03-28 23:25:12 +08:00
还有 NaN !==NaN , 也就是 NaN 不等于它自身
zybzzc
2018-03-28 23:47:32 +08:00
yyfearth
2018-03-29 09:01:07 +08:00
@mchl @songz 没区别的 因为 Number(0.0000008) === 0.0000008
parseInt(string) 所以都会被转换成 string
而 String(0.0000008) === '8e-7'
parseInt 不支持科学计数
所以 parseInt(0.0000008) === parseInt('8e-7') === 8

而 parseFloat 支持科学计数 所以没问题
parseFloat(0.0000008) === parseFloat('8e-7') === 8e-7 === 0.0000008
songz
2018-03-29 09:03:17 +08:00
parseInt(8e-6)
0
parseInt(8e-7)
8

为什么-6 就是 0 呢?
whosesmile
2018-03-29 10:01:24 +08:00
@songz 查了下文档,yyfearth 漏说了一句:
parseInt 和 parseFloat 接受的参数是 string,如果参数不是 string,那么会先转换为 string.
这和我们(包括我...)想象的不一样,以为接受的参数可以是数字

所以对 8e-6 的转换的流程是: parseInt(8e-6) === parseInt(String(8e-6)) === parseInt("0.000008") === 0
所以对 8e-7 的转换的流程是: parseInt(8e-7) === parseInt(String(8e-7)) === parseInt("8e-7") === 8

你要是问为什么 String(8e-6)和 String(8e-7)的结果不一样(因为我也奇怪),然后定位到 ECMA 的文档规范,没看懂,但是这就是规范规定的:根据数字范围的不同,转换成字符串的结果是不一样的。就这么任性。。。

我猜想这么设计的原因是 js 中所有的数字只有一种类型:Number,实际内存的表达式通过 float 方式存储的,这样如果数字的长度过大,转换为字符串就会非常长,所以才这么设计出了转换规则。
codehz
2018-03-29 11:57:00 +08:00
@oska117 #6 NaN 这个是设计(而且符合浮点数的标准
还有正 0 和负 0 呢!
Object.is(0, -0) //false
另外 NaN 也可以用 Object.is 来比较(
Justin13
2018-03-30 18:20:55 +08:00
差的那一位就是小数和科学计数法的边界。7 位及以上用科学计数法,6 位及以下依旧是小数,所以结果不同。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/442275

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX