Java的基本数据类型
我们知道,Java有八大基本数据类型,如下表所示:
数据类型 | 类型名 | 位长 | 取值范围 | 默认值 |
---|---|---|---|---|
布尔型 | boolean | 1 | true, false | false |
字节型 | byte | 8 | -128 ~ 127 | 0 |
字符型 | char | 16 | ‘\u000’ ~ ‘\uffff’ | ‘\u0000’ |
短整型 | short | 16 | -32768 ~ 32767 | 0 |
整型 | int | 32 | -2147483648 ~ 2147483647 | 0 |
长整型 | long | 64 | -9.22E18 ~ 9.22E18 | 0 |
浮点型 | float | 32 | 1.4E-45 ~ 3.4028E+38 | 0.0 |
双精度型 | double | 64 | 4.9E-324 ~ 1.7977E+308 | 0.0 |
这些类型都是有长度限制的(最长的也只有64位),一旦要表示的数据超出了它的类型位长限制,就会轻者丢失精度,重者发生溢出变为废数据。
例如:
int a = 4*1024*1024*1024;
System.out.println(a);
结果并不是简单的 4*1024*1024*1024
的值,而是这样的:

那 Java 能进行高精度运算吗?
拿出手机打开计算器试一下不就知道能不能了。
Java提供了两个用于高精度计算的类,分别是:
- BigInteger,支持任意精度的整数,可以表示任何大小的整数值,而不会丢失任何信息。
- BigDecimal,支持任何精度的定点数,例如,可以用来进行精确的货币计算。
它们都属于“包装器类”,都没有对应的基本类型。能作用于 int 或 float 的操作,也同样能作用于 BigInteger 或 BigDecimal,但都必须以方法调用取代运算符的方式来实现。理论上讲,只要机器刚得住,它们表示的数可以无限长。
但是它们的运算速度会慢一些,因为为了提高精度,做了很多复杂的操作。换句话说,就是在以速度换取精度。
我们用 BigInteger 对前面的运算做简单修改:
BigInteger bi = BigInteger.valueOf(4);
BigInteger bi2 = BigInteger.valueOf(1024);
bi = bi.multiply(bi2).multiply(bi2).multiply(bi2);
System.out.println(bi);
4*1024*1024*1024
正确的运算结果是:

网友评论