Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解决 JavaScript 中 parseInt() 的一个怪异行为

解决 JavaScript 中 parseInt() 的一个怪异行为

作者头像
Jimmy_is_jimmy
发布于 2022-12-07 06:39:12
发布于 2022-12-07 06:39:12
1.6K00
代码可运行
举报
文章被收录于专栏:call_me_Rcall_me_R
运行总次数:0
代码可运行

原文链接 Solving a Mystery Behavior of parseInt() in JavaScript -- 作者 Dmitri Pavlutin

parseInt() 是一个内置的 JavaScript 函数,它可以将数字字符串解析为整数。比如,我们将数字字符串 '100' 解析为整数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const number = parseInt('100');
number; // 100

如预期那样,'100' 被解析为整数 100

parseInt(numericalString, radix) 也接受第二个参数:radix(基数),另一个参数是数字字符串 numericalStringradix 参数允许你解析来自不同数字基数的字符串为整数,基数通常有 2,8, 10 和 16

我们使用基数为 2parseInt() 来解析一个数字字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const number = parseInt('100', 2);
number; // 4

parseInt('100', 2) 以基数 2 解析 '100' 为一个整数:所以它返回十进制数值 4

上面就是对 parseInt() 方法的简单介绍。

1. parseInt() 中的一个怪异行为

parseInt(numericalString) 总是将其第一个参数转换成字符串(如果它不是字符串的话),然后将这个字符串数字解析成整数。

这就是为什么你可以(但是不应这么做! )使用 parseInt() 来提取浮点数的整数部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parseInt(0.5); // => 0
parseInt(0.05); // => 0
parseInt(0.005); // => 0
parseInt(0.0005); // => 0
parseInt(0.00005); // => 0
parseInt(0.000005); // => 0

取出浮点数,比如 0.50.05 等等整数的部分。结果就是 0。这跟我们的预期结果一样。

那么提取 0.0000005 整数的部分会怎样呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parseInt(0.0000005); // => 5

parseInt() 将浮点数 0.0000005 解析为 5。这就很有趣且不符合预期...

为什么 parseInt(0.0000005) 会有如此怪异的行为呢?

2.解决 parseInt() 该怪异行为

我们回顾下,parseInt(numericalString) 对它的第一个参数做了什么:如果不是字符串,就将其转换为一个字符串,然后解析,之后返回解析的整数。

这可能是第一个线索。

我们手动将浮点数转换为字符串表现形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String(0.5); // => '0.5'
String(0.05); // => '0.05'
String(0.005); // => '0.005'
String(0.0005); // => '0.0005'
String(0.00005); // => '0.00005'
String(0.000005); // => '0.000005'
String(0.0000005); // => '5e-7'

String(0.0000005) 数值的显式转换和其它浮点数不同:它是指数符号exponential notation 字符串表现形式。

这是第二个线索 -- 很重要!

然后当指数符号字符串解析为整数,你就会得到整数 5

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parseInt(0.0000005); // => 5
// same as
parseInt(5e-7); // => 5
// same as
parseInt('5e-7'); // => 5

parseInt('5e-7') 考虑第一个数字 '5',跳过了 'e-7'

解密了!因为 parseInt() 总是将它第一个参数转换为字符串,浮点数字小于 就会被写成指数符号的形式。parseInt() 从浮点数的指数符号中取出整数。

译者加 -- 注意,parseInt() 取字符串前面整数的部分,比如:parseInt('12Jimmy34') 则有返回结果 12

备注,安全地取出浮点数整数的部分,我推荐使用 Math.floor() 函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

3. 总结

parseInt() 是个将数字字符串转换为整数的函数。

当你使用 parseInt() 获取浮点数的整数部分的时候,要小心。

小于 的浮点数(比如 0.0000005 等同于 )被转换为以指数符号表示形式(比如 5e-7 是 0.0000005 指数符号形式)。这就是为什么使用 parseInt() 作用于如此小的浮点数会出现非预期效果:仅解析指数表示形式的重要部分(比如 5e-7 中的 5)。

挑战:你可以解释为什么 parseInt(999999999999999999999) 会等于 1 可以在下面评论区写出你的思路。

本文正在参加「金石计划 . 瓜分6万现金大奖」

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
搞懂 parseInt() 的怪异行为
parseInt()是内置的 JS 函数,用于解析数字字符串中的整数。 例如,解析数字字符串'100':
前端小智@大迁世界
2022/03/22
1.1K0
为什么 JavaScript 的 parseInt(0.0000005) 打印“5”?
最近开发项目时遇到一个奇怪的问题,parseInt(0.0000005) === 5。正常情况下输出0是正确的,为什么是5呢?我们一起来探讨一下这个问题。
winty
2023/10/08
2110
为什么 JavaScript 的 parseInt(0.0000005) 打印“5”?
JavaScript 的 parseInt() 函数
parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数, radix 是2-36之间的整数,表示被解析字符串的基数。
HoneyMoose
2021/11/17
1.6K0
JavaScript 的 parseInt() 函数
大话 JavaScript(Speaking JavaScript):第十一章到第十五章
JavaScript 对所有数字都使用单一类型:它将它们全部视为浮点数。但是,如果小数点后没有数字,则不显示小数点:
ApacheCN_飞龙
2024/01/12
6580
JavaScript 转换数字为整数的方法
本文将会列举并说明JavaScript 把一个number(或者numerical的对象)转换成一个整数相关方法。
用户3158888
2019/05/29
1.1K0
透过网红面试题,超详细解析 parseInt,学不懂找我
最近面试了几个前端开发,我都问了一道算是网红面试题,其中两个应届毕业生,两个两年开发经验的,他们都没有给到我想要的答案。
coder_koala
2021/09/18
3.5K0
透过网红面试题,超详细解析 parseInt,学不懂找我
企业面试题: javascript中表达式parseInt("9")+parseFloat('7')的结果是什么?
parseFloat() 所解析的字符串中第一个小数点是有效的,而parseInt() 遇到小数点会停止解析,因为小数点并不是有效的数字字符。
舒克
2019/08/09
8940
前端-JavaScript 有用的代码片段和 trick
解析允许字符串中含有非数字字符,解析按从左到右的顺序,如果遇到非数字字符就停止。而转换不允许出现非数字字符,否者会失败并返回NaN。
grain先森
2019/03/29
1.1K0
关于数字的前端面试题
写在前面,总结面试题不一定是为了准备面试,更是对于自己的一种温故知新,了解自己知识的熟练度和理解度。 问题一览 如何判断一个值是否为NaN?运行环境内建的方法isNaN()有坑 如何判断两个浮点数相等
用户1687375
2018/06/08
1.4K0
JavaScript 里Number、parseFloat、parseInt的联系与区别
因为Number()方法转换字符串的时候比较复杂,所以一般处理字符串比较常用的是parseInt() / parseFloat()。
celineWong7
2020/11/05
1.8K0
TypeScript算法题实战——剑指 Offer篇(6)
在本文中,我们将使用TypeScript来解决剑指offer的算法题。这些问题涵盖了各种各样的主题,包括数组、字符串、链表、树、排序和搜索等。我们将使用TypeScript的强类型和面向对象的特性来解决这些问题,并通过实际的代码示例来演示如何使用TypeScript来解决算法问题。 本章节包括的题目有(难度是我个人感受的难度,非官方标准):
中杯可乐多加冰
2024/09/21
1190
JS - 生成随机数的方法汇总(不同范围、类型的随机数)
因为 random 的特点,要取得这几个区间内的浮点数稍微麻烦些,需要借助一些判断才能满足要求。
ccf19881030
2020/05/18
29.2K0
JavaScript中处理数字
当涉及到在JavaScript中处理数字时,有很多内置函数和方法可用。以下是一些常用的函数和方法:
王小婷
2024/03/14
2020
JavaScript之数据类型
  JavaScript中有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有1种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的。
用户6182664
2019/12/02
5780
JavaScript数字(数值)
当数字直接出现在程序中时,被称为数值直接量。在 JavaScript 程序中,直接输入的任何数字都被视为数值直接量。 示例1 数值直接量可以细分为整型直接量和浮点型直接量。浮点数就是带有小数点的数值,而整数是不带小数点的数值。
用户3519280
2023/07/07
2610
Javascript的5种基本数据类型总结
ECMAScript中有5种基本数据类型,分别是:Undefined,Null,Boolean,Number和String,还有一种复杂数据类型Object,Object本质上是由一组无序的名值对组成的。(这里就不细细讲述了)
全栈程序员站长
2022/10/28
7700
Javascript的5种基本数据类型总结
JavaScript 中的 NaN
另外还有 2 个特殊的数字值:Infinity(比其他任何数字都大的数字)和 NaN(表示“Not A Number”概念):
疯狂的技术宅
2020/02/18
2.1K0
Js中Number对象
JavaScript的Number对象是经过封装从而能够处理数字值的对象,Number对象由Number()构造器以及字面量声明的值在转化为包装对象时创建,JavaScript的Number类型为双精度IEEE 754 64位浮点类型。
WindRunnerMax
2020/10/10
3.5K0
JavaScript parseInt() 函数
radix 参数用于指定使用哪种数字系统,例如基数为 16(十六进制)表示字符串中的数字应从十六进制数解析为十进制数。
Insecure Fluoxetine
2024/04/08
1780
JavaScript parseInt() 函数
JavaScript 数据类型转换完全攻略
JavaScript 能够根据运算环境自动转换值的类型,以满足运算需要。但是在很多情况下需要开发者手动转换数据类型,以控制运算过程。
用户3519280
2023/07/07
3340
相关推荐
搞懂 parseInt() 的怪异行为
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档