为什么 parseInt (0.0000005) === 5 ?
The following article is from 前端开发爱好者 Author 前端小菜鸡之菜鸡互啄
最近在开发中遇到了一个奇怪的问题:
parseInt(0.0000005)===5
😨 按照我们正常的认知,应该输出0
才是正确的,但是为什么是5
?
😭 遇到问题的第一反应肯定是去查看文档呀,应该是自己的基础知识不够扎实
parseInt 是干什么的?
官方给出了这样的一个解释:
parseInt(string, radix)
解析一个字符串
并返回指定基数
的十进制整数, radix
是 2-36 之间的整数,表示被解析字符串
的基数
。
语法
parseInt(string, radix);
参数
string
: 要被解析的值。如果参数不是一个字符串,则将其转换为字符串(使用ToString
抽象操作)radix
:可选参数,从 2 到 36,表示字符串的基数。例如指定 16 表示被解析值是十六进制数。
说到这里让我想起了牛客上的一道进制转换的面试题
:
其实这里就可以巧妙的使用 parseInt
来解决
好了,回到开始的问题:parseInt(0.0000005)===5
?根据官方解释,parseInt
第一个参数需要是字符串形式的,显然我们传入的是一个浮点数,那么如果我们传入一个字符串的'0.0000005'
会怎么样???
验证传入字符串 '0.0000005'
按照官方的规范,传入字符串格式:
parseInt('0.5'); // => 0
parseInt('0.05'); // => 0
parseInt('0.005'); // => 0
parseInt('0.0005'); // => 0
parseInt('0.00005'); // => 0
parseInt('0.000005'); // => 0
看输出都是没有问题,那么问题肯定就是出在参数非字符串
的时候了
⭐️ 这里官方也给出了解释: 如果参数不是一个字符串,则将其转换为字符串(使用 ToString
抽象操作)
意思就是说:parseInt会将参数自动转换成字符串,再去做取整操作
解决 parseInt()的奥秘
然后让我们尝试将浮点数手动转换为字符串
表示形式:
String(0.5); // => '0.5'
String(0.05); // => '0.05'
String(0.005); // => '0.05'
String(0.0005); // => '0.005'
String(0.00005); // => '0.00005'
String(0.000005); // => '0.000005'
String(0.0000005); // => '5e-7'
显式转换为字符串的String(0.0000005)
行为与其他浮点数不同:它是指数表示法
的字符串表示形式!
当采用指数表示法解析为整数时,您将得到数字 5:
parseInt(0.0000005); // => 5
// 类似于
parseInt(5e-7); // => 5
// 类似于
parseInt('5e-7'); // => 5
parseInt('5e-7')
考虑到第一个数字'5'
,但跳过'e-7
'。
📚 得出结论:parseInt()
总是将其第一个参数转换为字符串,所以小于10 -6
的浮点数将以指数表示法
编写。然后 parseInt()从float的指数表示法中提取整数
!
如何安全获取浮点数整数部分
为了安全地提取浮点数的整数部分,建议使用以下Math.floor()
函数:
Math.floor(0.5); // => 0
Math.floor(0.05); // => 0
Math.floor(0.005); // => 0
Math.floor(0.0005); // => 0
Math.floor(0.00005); // => 0
Math.floor(0.000005); // => 0
Math.floor(0.0000005); // => 0
举一反三
🎯 现在,你能解释为什么 parseInt(999999999999999999999)
等于 1 吗?
- EOF -
觉得本文对你有帮助?请分享给更多人
推荐关注「前端大全」,提升前端技能
点赞和在看就是最大的支持❤️