今天遇到个问题,发现 js 中一些注意的地方
parseInt(0.000008) 结果为 0
parseInt(0.0000008) 结果为 8
parseInt("0.0000008") 结果为 0
第二个感觉好奇怪,就在网上搜, 结果在阮一峰的《 js 标准参考手册》发现
“对于那些会自动转为科学计数法的数字,parseInt 会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。”
也就是说,0.0000008 会先自动转换为 科学计数法 8e-7, 然后自动转为字符串 “ 8e-7 ”,结果就是 8 了
1
songz 2018-03-28 22:44:21 +08:00
先套个 floor 就没有意外了
|
2
rock_cloud 2018-03-28 22:50:54 +08:00
怎么感觉像是 bug。。。
|
3
huweitxdy 2018-03-28 23:03:26 +08:00
ecma 规范里似乎就是这么写的。。。
|
4
owwlo 2018-03-28 23:09:24 +08:00
踩坑留念
|
5
mchl 2018-03-28 23:13:39 +08:00 via iPhone
第一反应是试一下 parseInt(Number(0.0000008) )
|
6
oska117 OP 还有 NaN !==NaN , 也就是 NaN 不等于它自身
|
7
zybzzc 2018-03-28 23:47:32 +08:00 via Android
|
8
yyfearth 2018-03-29 09:01:07 +08:00 1
|
9
songz 2018-03-29 09:03:17 +08:00 1
parseInt(8e-6)
0 parseInt(8e-7) 8 为什么-6 就是 0 呢? |
10
whosesmile 2018-03-29 10:01:24 +08:00 2
@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 方式存储的,这样如果数字的长度过大,转换为字符串就会非常长,所以才这么设计出了转换规则。 |
11
codehz 2018-03-29 11:57:00 +08:00
|
12
Justin13 2018-03-30 18:20:55 +08:00 via Android
差的那一位就是小数和科学计数法的边界。7 位及以上用科学计数法,6 位及以下依旧是小数,所以结果不同。。
|