BigInteger和BigDecimal
BigInteger
BigInteger的作用是对整数做计算,一般的使用String类型初始化BigInteger,它除了封装了基本的加减乘除运算外还提供了signum(),abs()等函数,使用方式基本为创建两个BigInteger进行运算例如A_BigInteger.add(B_BigInteger)对两个数进行加法运算,结果还是一个BigInteger。然后它的作用远远不止于此,Java的八种数据类型整数精度最大的是Long,如果计算值超过了Long.Max_Value就会损失精度。使用BigInteger则完全可以避免。两个BigInteger的结果可以通过终止函数获取结果,例如intValue()将结果转换位int值,但是这里需要注意,如果结果已经超过了目标结果类型的精度则会不准确,最好的方式是通过.toString()函数获取一个字符串的值,这样即使结果大于Long.Max_Value也不会丢失精度。最后BigInteger不能运算小数,否则抛出异常。以下是代码示例:
public static void main(String[] args) { // int最大值 2147483647 System.out.println(Integer.MAX_VALUE); // long最大值 9223372036854775807 System.out.println(Long.MAX_VALUE); BigInteger bigInteger1 = new BigInteger("9223372036854775807"); BigInteger bigInteger2 = new BigInteger("9223372036854775807"); // 两个数相乘 BigInteger value12 = bigInteger1.multiply(bigInteger2); // 直接获取Long结果是错误的,因为已经超过了Long的最大精度 // long longValue = value12.longValue(); // 获取字符串可以 String svalue12 = value12.toString(); // 85070591730234615847396907784232501249 System.out.println(svalue12); // 在将相乘的结果/9223372036854775807 BigInteger bigInteger3 = new BigInteger(svalue12); BigInteger bigInteger4 = new BigInteger("9223372036854775807"); // 两个数相除 BigInteger bigInteger34 = bigInteger3.divide(bigInteger4); // 这个结果是没有超过Long的精度 long lbigInteger34 = bigInteger34.longValue(); // 9223372036854775807 System.out.println(lbigInteger34); BigInteger bigInteger5 = new BigInteger("1"); BigInteger bigInteger6 = new BigInteger("1"); // 两个数相加 BigInteger bigInteger56 = bigInteger5.add(bigInteger6); System.out.println(bigInteger56.byteValue()); BigInteger bigInteger7 = new BigInteger("2"); BigInteger bigInteger8 = new BigInteger("1"); // 两个数相减 BigInteger bigInteger78 = bigInteger7.subtract(bigInteger8); System.out.println(bigInteger78.byteValue()); // 错误的,它不支持小数 // BigInteger bigInteger9 = new BigInteger("1.2"); }
BigDecimal
BigDecimal在实际开发中要比BigInteger的使用频率高的多,原因就是它可以计算小数,并且它可以根据用户的设置对小数结果进行改变,例如保留小数位数,保留小数策略。
public static void main(String[] args) { Long max_long = Long.MAX_VALUE; System.out.println(max_long); BigInteger bigInteger = new BigInteger(max_long + ""); // 你可以使用一个BigInteger实例化BigDecimal BigDecimal bigDecimal1 = new BigDecimal(bigInteger); BigDecimal bigDecimal2 = new BigDecimal(bigInteger); // 除法运算 BigDecimal bigDecimal12 = bigDecimal1.divide(bigDecimal2); System.out.println(bigDecimal12.intValue()); // 使用字符串实例化BigDecimal做加法运算 BigDecimal bigDecimal3 = new BigDecimal("1"); BigDecimal bigDecimal4 = new BigDecimal("1"); BigDecimal bigDecimal34 = bigDecimal3.add(bigDecimal4); System.out.println(bigDecimal34.intValue()); // 使用字符串实例化BigDecimal做减法运算 BigDecimal bigDecimal5 = new BigDecimal("5"); BigDecimal bigDecimal6 = new BigDecimal("3"); BigDecimal bigDecimal56 = bigDecimal5.subtract(bigDecimal6); System.out.println(bigDecimal56.intValue()); // 使用字符串实例化BigDecimal做乘法运算 BigDecimal bigDecimal7 = new BigDecimal("3"); BigDecimal bigDecimal8 = new BigDecimal("4"); BigDecimal bigDecimal78 = bigDecimal7.multiply(bigDecimal8); System.out.println(bigDecimal78.intValue()); // 对小数做操作,这个加法运算的结果是 7.9888 BigDecimal bigDecimal9 = new BigDecimal("3.1"); BigDecimal bigDecimal10 = new BigDecimal("4.8888"); BigDecimal bigDecimal910 = bigDecimal9.add(bigDecimal10); System.out.println(bigDecimal910.toString()); BigDecimal bigDecimala1 = new BigDecimal("3.1"); BigDecimal bigDecimala2 = new BigDecimal("4.8888"); BigDecimal bigDecimala12 = bigDecimala1.add(bigDecimala2); // 对一个BigDecimal的结果进行小数舍入,以下是保留小数点后3位,多余的四舍五入 7.989 BigDecimal sbigDecimala12 = bigDecimala12.setScale(3, BigDecimal.ROUND_HALF_UP); System.out.println(sbigDecimala12.toString()); }