parseInt 在小数部分上的奇怪和不一致的行为
Strange and inconsistent behaviour of parseInt on decimal fractions
console.log(parseInt(0.0000008))
// > 8
console.log(parseInt(0.000008))
// > 0
console.log(parseInt(0.0000008, 10))
// > 8
console.log(parseInt(0.000008, 10))
// > 0
以上代码是 运行 在 Google Chrome 版本 62.0.3202.94(官方构建)(64 位) macOS Sierra 版本 10.12.6.
如您所见,行为不取决于您是否指定基数。
注意:我一般用~~
而不是parseInt
,这样看起来比较安全
为什么我会得到这些结果?
如果参数还不是字符串,parseInt
将其第一个参数字符串化。 0.000008
字符串化为 '0.000008'
,但 0.0000008
字符串化为 '8e-7'
.
如果 parseInt
在输入中发现无效字符,它将忽略该字符及其后的所有内容。 .
和 e
对基数 10 无效(并且 .
对任何基数都无效),因此 parseInt
将 '0.000008'
视为 '0'
并且'8e-7'
作为 '8'
.
我不知道你想在这里做什么,但 parseInt
不是执行此操作的工具。
console.log(parseInt(0.0000008))
// > 8
console.log(parseInt(0.000008))
// > 0
console.log(parseInt(0.0000008, 10))
// > 8
console.log(parseInt(0.000008, 10))
// > 0
以上代码是 运行 在 Google Chrome 版本 62.0.3202.94(官方构建)(64 位) macOS Sierra 版本 10.12.6.
如您所见,行为不取决于您是否指定基数。
注意:我一般用~~
而不是parseInt
,这样看起来比较安全
为什么我会得到这些结果?
parseInt
将其第一个参数字符串化。 0.000008
字符串化为 '0.000008'
,但 0.0000008
字符串化为 '8e-7'
.
如果 parseInt
在输入中发现无效字符,它将忽略该字符及其后的所有内容。 .
和 e
对基数 10 无效(并且 .
对任何基数都无效),因此 parseInt
将 '0.000008'
视为 '0'
并且'8e-7'
作为 '8'
.
我不知道你想在这里做什么,但 parseInt
不是执行此操作的工具。