Java提供了两个用于高精度计算的类:BigInteger和BigDecimal,这两个类都在java.math包下。
BigInteger
BigInteger表示不可变的任意精度的整数。
BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
有两个重要的构造方法:
1.BigInteger(String val)
将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
2.BigInteger(String val, int radix)
将指定基数(进制)的 BigInteger 的字符串表示形式转换为 BigInteger。
System.out.println(new BigInteger("110", 2));
System.out.println(new BigInteger("110", 8));
System.out.println(new BigInteger("110", 10));
System.out.println(new BigInteger("110", 16));
结果:
6
72
110
272
注意,如下语句会抛出错误:
new BigInteger("120", 2);
结果:
Exception in thread "main" java.lang.NumberFormatException: For input string: "120"
原因是二进制数不包括数字2。
基数radix的取值范围为[Character.MIN_RADIX, Character.MAX_RADIX],也即[2, 36]。
BigDecimal
BigDecimal表示不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。
BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。toString() 方法提供 BigDecimal 的规范表示形式。
BigDecimal指定了八种舍入模式(RoundingMode):
public final static int ROUND_UP = 0;
public final static int ROUND_DOWN = 1;
public final static int ROUND_CEILING = 2;
public final static int ROUND_FLOOR = 3;
public final static int ROUND_HALF_UP = 4;
public final static int ROUND_HALF_DOWN = 5;
public final static int ROUND_HALF_EVEN = 6;
public final static int ROUND_UNNECESSARY = 7;
关于每种模式的意义请见博文【Java中BigDecimal的8种舍入模式】。
示例:
MathContext context = new MathContext(6, RoundingMode.HALF_UP);
System.out.println(new BigDecimal(110));
System.out.println(new BigDecimal(110.11, context));
System.out.println(BigDecimal.TEN.divide(new BigDecimal("3"), 2,
RoundingMode.HALF_UP));
结果:
110
110.110
3.33
BigDecimal中定义的舍入模式已过时,Java推荐使用枚举类型RoundingMode。