BigInteger和BigDecimal

678 阅读3分钟

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");
    }

View Code

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());
    }

View Code