导航栏: 首页 评论列表

javascript 整数范围及对应 16 进制值

默认分类 2019/11/28 08:08

Java

在JAVA中一共有八种基本数据类型。

他们分别是byte、short、int、long、float、double、char、boolean、整型

其中byte、short、int、long都是表示整数的,只不过他们的取值范围不一样

byte的取值范围为 -128 ~ 127 ,占用1个字节(-2的7次方到2的7次方-1)[HEX: -80 ~ 7F]

short的取值范围为 -32768 ~ 32767 ,占用2个字节(-2的15次方到2的15次方-1)
[HEX: -8000 ~ 7FFF]

int的取值范围为( -2147483648 ~ 2147483647 ),占用4个字节(-2的31次方到2的31次方-1)
[HEX: -80000000 ~ 7FFFFFFF]

long的取值范围为(-9223372036854775808 ~ 9223372036854775807 ),占用8个字节(-2的63次方到2的63次方-1) 
[HEX: -8000000000000000 ~ 7FFFFFFFFFFFFFFF]

可以看到byte和short的取值范围比较小,而long的取值范围太大,占用的空间多,基本上int可以满足我们的日常的计算了,而且int也是使用的最多的整型类型了。

在通常情况下,如果JAVA中出现了一个整数数字比如35,那么这个数字就是int型的,如果我们希望它是byte型的,可以在数据后加上大写的B:35B,表示它是byte型的,同样的35S表示short型,35L表示long型的,表示int我们可以什么都不用加,但是如果要表示long型的,就一定要在数据后面加“L”。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Javascript

Number最小值:-1.7976931348623157E+308
Number最大值:1.7976931348623157E+308
当Number比-1E308还小,则会显示成-Infinity;
当Number比+1E308还大,则会显示成Infinity;
Infinity表示无穷大,也就是JavaScript也不知道它到底有多大。

JavaScript中的基本数据类Number是双精度浮点数,它可以表示的最大安全范围是

正负 9007199254740991 [HEX: 1FFFFFFFFFFFFF]

,也就是2的53次方减一,在浏览器控制台分别输入

Number.MAX_SAFE_INTEGER
Number.MIN_SAFE_INTEGER

可查看对应的最大/小值

const max = Number.MAX_SAFE_INTEGER;
// → 9_007_199_254_740_991
// 注意:为了便于阅读,我使用下划线作为分隔符将这些数字分组为千位数。
// 数字文字分隔符提案对普通的JavaScript数字文字使用正确。

将这个最大值加一,可以得到预期的结果:

max + 1;
// → 9_007_199_254_740_992 ✅

但是,如果我们再次增加它,结果不再可以完全表示为JavaScript Number:

max + 2;
// → 9_007_199_254_740_992 ❌

我们会发现max+1和max+2的结果一样。只要我们在JavaScript中获得这个特定的值,就无法判断它是否准确。对安全整数范围以外的整数(即从Number.MIN_SAFE_INTEGER到Number.MAX_SAFE_INTEGER)的任何计算可能会失去精度。出于这个原因,我们只能依靠安全范围内的数字整数值。

BigInt

BigInt是JavaScript中的一个新的原始类型,可以用任意精度表示整数。使用BigInt,即使超出JavaScript Number 的安全整数限制,也可以安全地存储和操作大整数。

chrome 67+开始支持BigInt,本文所有demo都是基于chrome 67。

要创建一个BigInt,在数字后面添加n后缀即可,例如,123变成123n。全局BigInt(number)函数可以用来将Number转换成BigInt。换句话说,BigInt(123) === 123n。让我们用这两种技术来解决我们之前遇到的问题:

BigInt(Number.MAX_SAFE_INTEGER) + 2n; // → 9_007_199_254_740_993n ✅

我们将两个Number 相乘:

1234567890123456789 * 123; // → 151851850485185200000 ❌

查看上面两个数字,末尾分别是9和3,9*3=27,然而结果末尾却是000,明显是错误的,让我们用BigInt代替:

1234567890123456789n * 123n; // → 151851850485185185047n ✅

这次我们得到了正确的结果。


>> 留言评论