[Java] 高精度数据类型

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] 高精度数据类型_第1张图片
数据溢出

那 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 正确的运算结果是:

[Java] 高精度数据类型_第2张图片
`4*1024*1024*1024`正解

你可能感兴趣的:([Java] 高精度数据类型)