BigInteger与BigDecimal

BigInteger

BigInteger构造方法

|--------------------------------------------------|------------------------------------|
| public BigInteger(int num, Random rnd) | 获取随机大整数,范围:[0 ~ 2的num次方-1] |
| public BigInteger(String val) | 获取指定的大整数 |
| public BigInteger(String val, int radix) | 获取指定进制的大整数 |

构造方法小结:
1、如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取。
2、如果BigInteger表示的超出long的范围,可以用构造方法获取。
3、对象一旦创建,BigInteger内部记录的值不能发生改变。
4、只要进行计算都会产生一个新的BigInteger对象

BigInteger静态方法

|--------------------------------------------|--------------------------------------------|
| public static BigInteger valueOf(long val) | 静态方法获取BigInteger的对象,内部有优化,范围[-16 ~ 16]。 |

BigInteger常用成员方法

|----------------------------------------------------------|--------------------|
| public BigInteger add(BigInteger val) | 加法 |
| public BigInteger subtract(BigInteger val) | 减法 |
| public BigInteger multiply(BigInteger val) | 乘法 |
| public BigInteger divide(BigInteger val) | 除法 |
| public BigInteger[] divideAndRemainder(BigInteger val) | 除法,获取商和余数 |
| public boolean equals(Object x) | 比较是否相同 |
| public BigInteger pow(int exponent) | 次幂、次方 |
| public BigInteger max/min(BigInteger val) | 返回较大值/较小值 |
| public int intValue(BigInteger val) | 转为int类型整数,超出范围数据有误 |

示例代码:

java 复制代码
    @Test
    public void bigInteger() {
    
        BigInteger gz = new BigInteger("5325252523663464364436436346");

        //1.创建两个BigInteger对象
        BigInteger bd1 = BigInteger.valueOf(10);
        BigInteger bd2 = BigInteger.valueOf(5);

        //2.加法
        BigInteger bd3 = bd1.add(bd2);
        System.out.println(bd3);

        //3.除法,获取商和余数
        BigInteger[] arr = bd1.divideAndRemainder(bd2);
        System.out.println(arr[0]);
        System.out.println(arr[1]);

        //4.比较是否相同
        boolean result = bd1.equals(bd2);
        System.out.println(result);

        //5.次幂
        BigInteger bd4 = bd1.pow(2);
        System.out.println(bd4);

        //6.max
        BigInteger bd5 = bd1.max(bd2);


        //7.转为int类型整数,超出范围数据有误
        /*
            BigInteger bd6 = BigInteger.valueOf(2147483647L);
            int i = bd6.intValue();
            System.out.println(i);
        */

        BigInteger bd6 = BigInteger.valueOf(200);
        double v = bd6.doubleValue();
        System.out.println(v);//200.0
    }

运行结果:

BigInteger实现高精度计算出 S=1!+2!+3!+⋯+n!(≤50)
java 复制代码
@Test
public void test() {

    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();

    BigInteger ans = new BigInteger("0");
    for (int i = n; i > 0; i--) {
        BigInteger res = new BigInteger("1");
        for(int j = i; j > 0; j--) {
            res = res.multiply(BigInteger.valueOf(j));
        }
        ans = ans.add(res);
    }
    System.out.println(ans);
}
java 复制代码
@Test
public void test() {
        BigInteger days = new BigInteger(String.valueOf(20));
        for (int i = 1; i < 22; i ++ ) {
            days = days.multiply(BigInteger.valueOf(20));
        }
        System.out.println(days.mod(BigInteger.valueOf(7)));
        //算出20^22的结果后,再mod上7,然后再加上6就是我们的答案,因为是从星期6开始枚举的。
    }

BigDecimal

BigInteger构造方法

|-------------------------------|----------------------|
| public BigDecimal(int val) | |
| public BigDecimal(long val) | |
| public BiDecimal(double val) | 具有不可预知性,可能丢失精度,不建议使用 |
| public BigDecimal(String val) | 常用 |

BigInteger静态方法

|----------------------------------------------|-----------------------------------------------------------------------|
| public static BigDecimal valueOf(double val) | 底层是new BigDecimal(String str) 没有超出double范围建议使用静态方法,超出double范围建议使用构造方法 |
| public static BigDecimal valueOf(long val) | 内部有优化[0 ~ 10]的整数!!! |

BigInteger常用成员方法

|----------------------------------------------|------|
| public BigDecimal add(BigDecimal value) | 加法运算 |
| public BigDecimal subtract(BigDecimal value) | 减法运算 |
| public BigDecimal multiply(BigDecimal value) | 乘法运算 |
| public BigDecimal divide(BigDecimal value) | 除法运算 |

代码示例:

java 复制代码
@Test
    public void test1() {
        BigDecimal b1 = new BigDecimal("1") ;
        BigDecimal b2 = new BigDecimal("3") ;

        System.out.println(b1.divide(b2 , 2 , RoundingMode.UP));
    }
java 复制代码
    @Test
    public void test2() {
        BigDecimal b1 = new BigDecimal("1") ;
        BigDecimal b2 = new BigDecimal("3") ;

        System.out.println(b1.divide(b2 , 2 , RoundingMode.FLOOR));
    }
java 复制代码
    @Test
    public void test3() {
        BigDecimal b1 = new BigDecimal("0.3") ;
        BigDecimal b2 = new BigDecimal("4") ;

        System.out.println(b1.divide(b2 , 2 , RoundingMode.HALF_UP));
    }
相关推荐
功德+n7 分钟前
在 Maven 中使用 <scope> 元素:全面指南
java·maven
失业写写八股文26 分钟前
Java类加载阶段深度解析:三步走全流程详解
java
yyueshen34 分钟前
单例模式,有必要用volatile么?
java·单例模式·设计模式
一条闲鱼_mytube35 分钟前
[Kubernetes] 7控制平面组件
java·平面·kubernetes
Stack Overflow?Tan9036 分钟前
c++实现在同一台主机两个程序实现实时通信
开发语言·c++
MZWeiei36 分钟前
Scala:case class(通俗易懂版)
开发语言·后端·scala
闯闯桑38 分钟前
scala 中的@BeanProperty
大数据·开发语言·scala
计算机老学长39 分钟前
基于Python的商品销量的数据分析及推荐系统
开发语言·python·数据分析
MZWeiei43 分钟前
scala有关 类 的知识点与Java的比较
开发语言·scala
Y雨何时停T1 小时前
Spring IoC 详解
java·spring·rpc