java中常用的API-BigInteger和BigDecimal

目录

BigInteger(大的整数)

基本使用

构造方法

成员方法

原理解析

BigDecimal(大的小数)

基本使用

构造方法

成员方法 

原理解析


BigInteger(大的整数)

基本使用

构造方法

下面是对三个构造方法的演示: 

import java.math.BigInteger;
import java.util.Random;

public class BigintegerDemo {
    public static void main(String[] args) {
        //获得一个个随机的大整数
        BigInteger bigNum1 = new BigInteger(3,new Random());
        //指定随机数的范围为为0~2的3次幂-1
        System.out.println(bigNum1);
        //获得10个随机的大整数
        Random r = new Random();
        for (int i = 0; i < 10; i++) {
            BigInteger bigNum2 = new BigInteger(3,r);
            //指定随机数的范围为为0~2的3次幂-1
            System.out.println(bigNum2);
        }

        //获得一个指定的大整数
        BigInteger bigNum3 = new BigInteger("123456789");
        //字符串必须是整数,否则会报错
        System.out.println(bigNum3);

        //获得指定进制的大整数
        BigInteger bigNum4 = new BigInteger("10110011",2);
        //字符串中的数必须是满足进制需求的整数
        System.out.println(bigNum4);
    }
}

还有一个静态方法

下面是对这个静态方法的演示:

import java.math.BigInteger;

public class BigintegerDemo2 {
    public static void main(String[] args) {
        //静态方法获取Biginteger的对象,内部有优化
        BigInteger bigNum5 = BigInteger.valueOf(100);
        //1.能表示的范围比较小,范围为long的范围
        System.out.println(bigNum5);

        //2.对内部常用的数字-16~16进行了优化,提前创建好了Biginteger对象,如果多次获取,不会重新创建
        BigInteger bigNum6 = BigInteger.valueOf(16);
        BigInteger bigNum7 = BigInteger.valueOf(16);
        System.out.println(bigNum6 == bigNum7);//比较6和7的地址值是否一致,true

        BigInteger bigNum8 = BigInteger.valueOf(17);
        BigInteger bigNum9 = BigInteger.valueOf(17);
        System.out.println(bigNum8 == bigNum9);//比较8和9的地址值是否一致,false


    }
}

 构造方法小结

成员方法

下面是对部分成员方法的代码实现

import java.math.BigInteger;

public class BigintegerDemo3 {
    public static void main(String[] args) {
        //创建两个Biginteger对象
        BigInteger a = new BigInteger("100");
        BigInteger b = new BigInteger("200");
        //加法
        BigInteger sum = a.add(b);
        System.out.println(sum); // 输出:300
        //减法
        BigInteger difference = a.subtract(b);
        System.out.println(difference); // 输出:-100
        //乘法
        BigInteger product = a.multiply(b);
        System.out.println(product); // 输出:20000
        //除法
        BigInteger quotient = b.divide(a);
        System.out.println(quotient); // 输出:2
        // 获取余数
        BigInteger remainder = b.mod(a);
        System.out.println(remainder); // 输出:0
        //比较
        int comparison = a.compareTo(b);
        if (comparison < 0) {
            System.out.println("a is less than b");
        } else if (comparison > 0) {
            System.out.println("a is greater than b");
        } else {
            System.out.println("a is equal to b");
        }
        //幂运算
        BigInteger power = a.pow(3); // 计算a的3次方
        System.out.println(power); // 输出:1000000
    }
}

原理解析

底层存储方式

一个简单的例子

BigInteger的底层存储方式主要是利用一个int的数组(通常称为mag)来存储大整数。当需要存储的整数大于32位时,它会被分割成多个32位的部分,并存储在这个int数组中。这种存储方式使得BigInteger能够表示任意精度的整数,从而突破了Java中基本整数类型(如byte、short、int、long)的大小限制

BigInteger的存储上线

所以BigInteger的存储几乎无上限 

BigDecimal(大的小数)

表示较大地小数解决小数运算精度失真的问题

基本使用

构造方法

构造方法获取BigDecimal对象

public BigDecimal(double val)     (这种方法可能是不精确的,所以不建议去使用)

public BigDecimal(String val)

静态方法获取BigDecimal对象

public static BigDecimal valueOf(double val)

下面是对上述方法的演示

import java.math.BigDecimal;

public class BigDecimalDemo {
    public static void main(String[] args) {
        //创建double类型的bigdecimal对象
        BigDecimal bd1 = new BigDecimal(0.01);
        System.out.println(bd1);//结果不精确

        //创建string类型的bigdecimal对象
        BigDecimal bd2 = new BigDecimal("0.01");
        System.out.println(bd2);//结果精确
        BigDecimal bd3 = new BigDecimal("0.09");
        BigDecimal bd4 = bd3.add(bd2);
        System.out.println(bd4);

        //通过静态方法获取对象
        BigDecimal bd5 = BigDecimal.valueOf(10);
        BigDecimal bd6 = BigDecimal.valueOf(10);
        System.out.println(bd5 == bd6);//true
        //如果表示的数字不大,没有超出double范围,建议使用静态方法
        //如果表示的数字大,超出double范围,建议使用构造方法
        //如果传递0~10的整数,那么方法会返回已经创建好的对象,不用new新的对象
    }
}

成员方法 

下面是对成员方法的代码示例:

import java.math.BigDecimal;

public class BigDecimalDemo2 {
    public static void main(String[] args) {
        BigDecimal bd1 = new BigDecimal("123.456");
        BigDecimal bd2 = new BigDecimal("789.123");
        //创建两个bigdecimal对象
        System.out.println("bd1: " + bd1);
        System.out.println("bd2: " + bd2);

        //加法
        bd1 = bd1.add(bd2);
        System.out.println("bd1 + bd2: " + bd1);

        //减法
        bd1 = bd1.subtract(bd2);
        System.out.println("bd1 - bd2: " + bd1);

        //乘法
        bd1 = bd1.multiply(bd2);
        System.out.println("bd1 * bd2: " + bd1);

        //除法
        bd1 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);
        System.out.println("bd1 / bd2: " + bd1);
        //在除法中,需要指定小数点后的位数和舍入模式。这里使用了两位小数和四舍五入模式。

        //比较
        int cmp = bd1.compareTo(bd2);
        if (cmp > 0) {
            System.out.println("bd1 is greater than bd2");
        } else if (cmp < 0) {
            System.out.println("bd1 is less than bd2");
        } else {
            System.out.println("bd1 is equal to bd2");
        }

        //设置精度
        bd1 = bd1.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("bd1 with scale set to 2: " + bd1);
    }
}

tip:在除法中除了我们上述四舍五入以外的舍去方式

原理解析

底层存储模式

如果想要清晰地看出底层逻辑,就需要设debug测试 

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫WJP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值