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

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

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

原文链接 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() 总是将它第一个参数转换为字符串,浮点数字小于 106 就会被写成指数符号的形式。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() 获取浮点数的整数部分的时候,要小心。

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

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

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手教你用go语言实现聊天室
手撕代码八百里
2024/01/10
4140
go实现tcp网络编程
本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn
仙士可
2022/01/20
5240
go实现tcp网络编程
Go语言服务器开发之简易TCP客户端与服务端实现方法
Go语言具备强大的服务器开发支持,这里示范了最基础的服务器开发:通过TCP协议实现客户端与服务器的通讯。 一 服务端,为每个客户端新开一个goroutine 代码如下:func ServerBase() { fmt.Println("Starting the server...") //create listener listener, err := net.Listen("tcp", "192.168.1.27:50000") if err != nil {
李海彬
2018/03/26
1.2K0
【Golang】快速复习指南QuickReview(九)——socket
Socket网路编程对于B/S项目来说,几乎不会涉及;但是如果涉及游戏服务器开发,或者上位机服务器开发,自定义通信协议,Socket网络编程就变得常见了。
DDGarfield
2022/06/23
2750
GO网络编程分享
每一层有每一层的独立功能,大多数网络都采用分层的体系结构,每一层都建立在它的下层之上,向它的上一层提供一定的服务,而把如何实现这一服务的细节对上一层加以屏蔽。
阿兵云原生
2023/02/16
3490
Golang之旅24-socket编程
主要是用来处理网络上流动的数据包。该层规定了通过怎么样的传输路径到达对方,选择合适的传输路径。主要是包含IP协议用来处理各种数据包给对方。保证传输准确性的是IP协议和Mac地址。
皮大大
2021/03/02
5450
一篇文章带你了解Go语言基础之网络编程
多台机器要实现互相通讯,其实是一个非常复杂的过程,底层从铺设网线,网线接口,交换机,路由器,在到规定各种协议。
Go进阶者
2021/01/22
4780
Go语言实现TCP通信
章节 go 优势 go 实现 TCP 通信 1 go 语言优势 1.1 go 语言优势 注意:跟本章似乎没有什么联系 2 go 实现TCP通信 2.1 server.go unix 网络编程步骤: S
用户1081422
2020/04/08
2.5K0
Go 语言使用 net 包实现 Socket 网络编程
友情提示:此篇文章大约需要阅读 10分钟12秒,不足之处请多指教,感谢你的阅读。订阅本站
Meng小羽
2020/05/26
1.6K0
Go 语言使用 net 包实现 Socket 网络编程
Go语言学习(四)
interface{} 类型,相当于java中的Object类型,可以匹配Go的任何数据类型,通常用在map等变量的value中使用,用来存放任意的数据类型的值:
呱牛笔记
2023/05/02
2810
Go语言学习(四)
腾讯一面:TCP的黏包怎么解决?
当多个逻辑上的数据包被封装在一个TCP数据包中进行传输时,接收端可能会一次性接收到多个数据包的内容,或者将多个逻辑上的数据包拆分成多个TCP数据包进行接收,这就是所谓的TCP粘包现象。
千羽
2024/02/21
2330
腾讯一面:TCP的黏包怎么解决?
Go Web---tcp服务器
这部分我们将使用 TCP 协议和之前讲到的协程范式编写一个简单的客户端-服务器应用,一个(web)服务器应用需要响应众多客户端的并发请求:Go 会为每一个客户端产生一个协程用来处理请求。我们需要使用 net 包中网络通信的功能。它包含了处理 TCP/IP 以及 UDP 协议、域名解析等方法。
大忽悠爱学习
2022/08/23
1.7K0
Go Web---tcp服务器
Golang之Socket
go创建socket很简单 package main import ( "fmt" "net" ) func main() { //服务器监听地址 fmt.Println("start server...") listen, err := net.Listen("tcp", "127.0.0.1:50000") if err != nil { fmt.Println("listen failed,err:", err) re
超蛋lhy
2018/08/31
1.1K0
Golang之Socket
Go:创建TCP服务器和客户端
在开始编程之前,我们先简单了解一下TCP的工作原理。TCP通信包括三个步骤:建立连接、数据传输和断开连接。当两台机器想通过TCP进行通信时,它们首先需要建立一个连接,然后才能开始数据传输。数据传输完毕后,连接就可以断开。
运维开发王义杰
2023/08/10
1K0
Go:创建TCP服务器和客户端
net.Dial与net.Listen
net.Listen能够监听本地端口,接收特定协议建立的连接,如果成功接收,则返回一个Listener接口
TomatoCool
2023/07/31
7730
基于Go的网络基础知识笔记
Lemon黄
2024/08/27
1550
基于Go的网络基础知识笔记
8.Go编程快速入门学习
[TOC] 0x00 Go语言基础之Socket网络编程 现在的我们几乎每天都在使用互联网,但是你知道程序是如果通过网络互相通信吗? 描述: 相信大部分人通常是一知半解的,作为一个程序员👨‍💻‍,对于网络模型你应该了解,知道网络到底是怎么进行通信的,进行工作的,为什么服务器能够接收到请求,做出响应。这里面的原理应该是每个 Web 程序员应该了解的。 本章我们就一起来学习下Go语言中的网络编程,关于网络编程其实是一个很庞大的领域,本文只是简单的演示了如何使用net包进行TCP和UDP通信。 1.基础概念介绍
全栈工程师修炼指南
2022/09/29
7920
8.Go编程快速入门学习
Go语言实践_实现一(服务器端)对多(客户端)在线聊天室
运用Go语言中的goroutine和通道实现一个简单的一个服务器端对多个客户端的在线聊天
Zoctopus
2018/08/03
2.4K0
Go语言实践_实现一(服务器端)对多(客户端)在线聊天室
go语言TCP编程入门
服务端 服务端的处理流程 监听端口8888 接收客户端的tcp连接 创建gorountine,处理该链接的请求(通常客户端会通过链接发送请求包) 客户端 客户端的处理流程 建立与服务端的链接 发送请求
程序员小饭
2020/09/07
1.7K0
(四十六)golang--网络编程(简易的聊天系统)
Go主要的目标之一就是面向大规模后端服务程序,网络通信这块是服务端程序必不可少也是至关键的一部分。
西西嘛呦
2020/08/26
7030
相关推荐
手把手教你用go语言实现聊天室
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验