【轻聊前端】JavaScript中的数字游戏

本文探讨JavaScript中的数字类型Number,包括其精度问题、BigInt的使用、数字判定和Math对象的方法。通过示例解析了大数、小数的精度误差,如0.1 + 0.2不等于0.3的原因,并介绍了处理这些问题的策略。同时讲解了toString、toFixed、isInteger等方法,以及Math对象的常用属性和方法,如Math.PI、Math.random等,帮助开发者更好地理解和使用JavaScript中的数字操作。
摘要由CSDN通过智能技术生成

2022版idea永久试用(使用)30秒教你学会操作Java编程必备!,新手必备神器!不用破解 永久白嫖_哔哩哔哩_bilibili

数字,即本篇的主角Number,在程序的世界里能代表很多东西——状态、年龄、价格、计数器等,但由于存储机制的原因,Number并不能很健壮地适应所有场景,就会有一些细节问题,此篇文章,我们沿着Number的属性和方法一起讨论一下数字的应用场景、问题及解决方案。

再谈基本类型

在聊变量的那篇文章里,我们说JavaScript中原本有5种基本类型,加上ES6之后引入的Symbol(符号),是6种,但是,还有一种“预备役”的类型——BigInt,目前应该是在“建议推荐标准阶段”,可以按其字面意思理解叫“大整数”。

说“大整数”,得先看看Number,JavaScript中是没有其他语言中的“int、float、double”这些类型的,统一为定义一个Number类型的数字,那么,是因为它不够大?还真是。

精度的“陷阱”

大数

Number能够表示的最大数字是 2的53次方 - 1。咱先看看这个数是多少:

9007199254740991

使用 Number.MAX_SAFE_INTEGER 即最大的安全整数也可获得这个值。

类似地,Number中有这么几个值:

Number.MAX_VALUE // 1.7976931348623157e+308
Number.MAX_SAFE_INTEGER // 9007199254740991
Number.MIN_VALUE // 5e-324
Number.MIN_SAFE_INTEGER // -9007199254740991

乍一看,已经挺大了,用正常的计数法已经读不出来,一旦超过这个值,就会被转换为科学计数法,形如:1.79e+308,且精度上会有误差。

问题来了,什么时候会用这么大的数?比如,前后端进行Long型数据传递的时候,就可能出现这种情况,而且这种情况是需要处理的,在之前,一种常见的方法是把它转换为字符串,逐位进行计算,之后再组合。一些专门用于大数处理的库也是这么做的,比如:big.js

有了BigInt类型之后,就可辅助处理这种情况。比如,可以像下面这样定义:

10n,或者调用函数BigInt()

它类似Number,但也有一些不同,它不能用 Math 对象中的方法;也不能和任何 Number 实例混合运算,两者必须转换成同一种类型。当然,还有一件自然的事情,就是带小数的运算会丢掉小数部分取整。

说了这么多,看看它能够发挥的作用吧。

let testInt = 9007199254740991;
testInt * 1000000   // 9.007199254740991e+21
BigInt(testInt * 1000000)  //  9007199254740990951424n

可以看出,在进行BigInt处理后,数字不再会被“科学化”。但这个类型不能乱用,只有当确定数字会超过 2的53次方时才用,且不宜进行 Number 装换。

小数

既然会有精度问题,涉及大数就很可能涉及小数。比如大家喜闻乐道的“0.1 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值