一、BigInteger(操作整型)

为什么要引入BigInteger类?

       在 Java 中,有许多数字处理的类,比如 Integer类,但是Integer类有一定的局限性,我们都知道 Integer 是 Int 的包装类,int 的最大值为2^31-1,若希望描述更大的整数数据时,使用Integer 数据类型就无法实现了,所以Java中提供了BigInteger 类;BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支持任意精度的整数,也就是说在运算中,BigInteger类型可以准确地表示任何大小的整数值而不会丢失任何信息。

  • BigInteger类位于java.math包中
  • 在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,此时要使用BigInteger类进行操作

1.构造方法

public BigInteger(String val)

  • 将一个字符串变成BigInteger类型的数据

2.基本运算方法

add(),subtract(),multiply(),divide()

①public BigInteger add(BigInteger val)

  • 加法

②public BigInteger subtract(BigInteger val)

  • 减法

③public BigInteger multiplyt(BigInteger val)

  • 乘法

④public BigInteger divide(BigInteger val)

  • 除法

⑤public BigInteger max(BigInteger val)

  • 返回两个大数字中的最大值

⑥public BigInteger min(BigInteger val)

  • 返回两个大数字中的最小值

代码示例:

import java.math.BigInteger;

public class BigIntegerDemo1 {
        public static void main(String[] args) {
            /*
            BigInteger  大整数
            long 8个字节  最大值:9223372036854775807
            */
            // long n = 9223372036854775808L;
            // 声明BigInteger对象
            BigInteger b1 = new BigInteger("9223372036854775808111") ;
            BigInteger b2 = new BigInteger("2222222222222222222222") ;
            // 加法操作
            BigInteger b3 = b1.add(b2);
            System.out.println(b3);// 11445594259076998030333
            // 减法操作
            BigInteger b4 = b1.subtract(b2);// 7001149814632553585889
            System.out.println(b4);
            // 乘法操作
            BigInteger b5 = b1.multiply(b2);// 20496382304121724018022394806214032272042642
            System.out.println(b5);
            // 除法操作
            BigInteger b6 = b1.divide(b2);
            System.out.println(b6);// 4(divide()方法本身只是把最终的商保存下来了)
            // 求出最大数
            BigInteger b7 = b1.max(b2);
            System.out.println(b7);// 9223372036854775808111
            // 求出最小数
            BigInteger b8 = b1.min(b2);
            System.out.println(b8);//2222222222222222222222
        }
}

二、BigDecimal(操作小数)

为什么要引入BigDecimal类?

在计算机中不论是float还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度;根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确,只能无限接近于那个值。

  • Java在java.math包中提供的API类BigDecimal
  • 对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。

十进制二进制转换图:

 

 

int java 最大数 java int最大值和integer_System

public class BigDecimalDemo {
    public static void main(String[] args) {
        System.out.println(12-11.9);//0.09999999999999964
    }
}

但是,在项目中,我们不可能让这种情况出现,特别是金融项目,因为涉及金额的计算都必须十分精确,你想想,如果你的支付宝账户余额显示193.99999999999998,那是一种怎么样的体验?因此,java为我们提供了BigDecimal类。

1.构造方法

public BigDecimal(String val)

  • 将字符串表示形式转换为BigDecimal

2.基本运算方法

add(),subtract(),multiply(),divide()

①public BigDecimal add(BigDecimal val)

  • 加法

②public BigDecimal subtract(BigDecimal val)

  • 减法

③public BigDecimal multiplyt(BigDecimal val)

  • 乘法

④public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)

  • 除法
  • int scale代表精度,int roundingMode代表舍入模式 比如:四舍五入

代码示例:

import java.math.BigDecimal;

public class BigDecimalDemo {
        /*
           BigDecimal  大浮点
        */
        public static void main (String[]args){
            System.out.println(12-11.9);//0.09999999999999964
            BigDecimal b1 = new BigDecimal("12");
            BigDecimal b2 = new BigDecimal("11.9");
            //加法
            System.out.println(b1.add(b2));// 23.9
            //减法
            System.out.println(b1.subtract(b2));// 0.1
            //乘法
            System.out.println(b1.multiply(b2));//142.8
            //除法
            //System.out.println(b1.divide(b2));// 此时的结果是一个无限循环小数,程序会报错,所以需要指定精度和舍入模式
            //                              精度         舍入模式
            System.out.println(b1.divide(b2, 3, BigDecimal.ROUND_CEILING));// 1.009

       }
}