查看原文
其他

为什么 parseInt (0.0000005) === 5 ?

前端大全
2024-08-23

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 -

推荐阅读  点击标题可跳转

1、产品:“写个 banner 这么费劲?”

2、10 个常用的 JS 工具库,80% 的项目都在用!

3、面试官居然要我用 JS 代码计算 LocalStorage 容量!


觉得本文对你有帮助?请分享给更多人

推荐关注「前端大全」,提升前端技能

点赞和在看就是最大的支持❤️

继续滑动看下一个
前端大全
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存