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