大数类

大数类

1.大数类基本概述

Java在设计的时候就考虑到了一些特殊的应用环境,当一个数字非常大的时候,是无法用基本数据类型接收的,所以专门设计了大数字处理类。在早期开发中如果遇到大数字的时候往往会使用String类进行接收,之后使用拆分的方式进行计算。但是,这一系列的操作过于繁琐,所以为了解决这样的难题,在java.lang.Math包中提供了大数字的操作类:BigInteger(整数)、BigDecimal(浮点数),这两个类都是Number子类。其继承图如下:


2.BigInteger类的常用方法

方法类型描述
public BigInteger(String val)构造将一个字符串变为BigInteger类型的数据
public BigInteger add(BigInteger val)普通加法计算
public BigInteger subtract(BigInteger val)普通减法计算
public BigInteger multiply(BigInteger val)普通乘法计算
public BigInteger divide(BigInteger val)普通除法计算
public BigInteger max(BigInteger val)普通返回两个大数字中的最大值
public BigInteger min(BigInteger val)普通返回两个大数字中的最小值
public BigInteger[] divideAndRemainder(BigInteger val)普通除法操作:数组的第一个元素为商,第二个元素为余数

案例:使用BigInteger实现四则运算

public class BigIntegerTestDemo {
    public static void main(String[] args){
        BigInteger bigIntegerNumber01 = new BigInteger("25");
        BigInteger bigIntegerNumber02 = new BigInteger("4");
        
        System.out.println("bigIntegerNumber01:" + bigIntegerNumber01);
        System.out.println("bigIntegerNumber02:" + bigIntegerNumber02);
        System.out.println("加法操作:" + bigIntegerNumber01.add(bigIntegerNumber02));
        System.out.println("减法操作:" + bigIntegerNumber01.subtract(bigIntegerNumber02));
        System.out.println("乘法操作:" + bigIntegerNumber01.multiply(bigIntegerNumber02));
        System.out.println("除法操作:" + bigIntegerNumber01.divide(bigIntegerNumber02));
        BigInteger[] result = bigIntegerNumber01.divideAndRemainder(bigIntegerNumber02);
        System.out.println("商:" + result[0] + ",余数:" + result[1]);
    }
}

/*
输出结果:
bigIntegerNumber01:25
bigIntegerNumber02:4
加法操作:29
减法操作:21
乘法操作:100
除法操作:6
商:6,余数:1
*/

上述例子基于BigInteger类实现了基础四则运算,可以发现实例化BigInteger类对象时的数据类型为String,这样就可以不受数据类型长度的限制。


3.BigDecimal类的常用方法

方法类型描述
public BigDecimal(double val)构造将double类型转换为BigDecimal
public BigDecimal(int val)构造将int类型转换为BigDecimal
public BigDecimal(String val)构造将字符串形式转换为BigDecimal
public BigDecimal add(BigDecimal augend)普通加法计算
public BigDecimal subtract(BigDecimal subtrahend)普通减法计算
public BigDecimal multiply(BigDecimal multiplicand)普通乘法计算
public BigDecimal divide(BigDecimal divisor)普通除法计算
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)普通除法计算设置保留小数位与进位模式

tips:在创建BigDecimal实例化对象的时,构造方法优先选择java.math.BigDecimal.BigDecimal(String val)

因为,当使用double作为构造方法参数的时候,由于我们传入的值无法精确作为一个double类型,所以可能会出现我们不希望的结果,其精度不可控。 如下:

public class CreateBigDecimalTestDemo {
    public static void main(String[] args) {
        double num01 = 12.34;
        int num02 = 12;
        
        //double类型
        BigDecimal number01 = new BigDecimal(num01);
        //String类型
        BigDecimal number02 = new BigDecimal(String.valueOf(num01));
        //int类型
        BigDecimal number03 = new BigDecimal(num02);
        System.out.println("number01:" + number01);
        System.out.println("number02:" + number02);
        System.out.println("number03:" + number03);
    }
}

/*
输出结果:
number01:12.339999999999999857891452847979962825775146484375
number02:12.34
number03:12
*/

由上测试可得:String类型为参数的构造方法是完全可预知的:写入new BigDecimal(“0.1”) 将创建一个BigDecimal对象,它正好等于预期的 0.1。因此,通常建议优先使用String构造方法。倘若,必须以double类型用作构造函数的参数时,可先将doule类型转换为String,String.value(double double)转成String类型,然后使用BigDecimal的参数为String类型的构造方法。

BigDecimal类与BigInteger类的操作形式类似,但是BigDecimal类中提供有一个进位的除法操作,可以利用此方法实现四舍五入处理。

案例:使用BigDecimal实现四舍五入

class MathUtil {
    private MathUtil() {
    }

    /**
     * 实现数据的四舍五入操作
     * @return 四舍五入处理后的结果
     * @parm num 要进行四舍五入操作的数字
     * @parm scale 四舍五入保留的小数位数
     */
    public static double round(String num, int scale) {
        //数字除以1.0还是数字本身,divide()方法保留指定位数的小数,并设置进位模式为向上进位(HELF_UP)
        return new BigDecimal(num).divide(new BigDecimal("1.0"), scale, RoundingMode.HALF_UP).doubleValue();
    }
}

public class BigDecimalTestDemo {
    public static void main(String[] args) {
        double number = 19.5364;
        System.out.println(number + "保留两位:" + MathUtil.round(String.valueOf(number), 2));
        System.out.println(number + "保留三位:" + MathUtil.round(String.valueOf(number), 3));
    }
}

/*
输出结果:
19.5364保留两位:19.54
19.5364保留三位:19.536
*/

上述例子主要是利用BigDecimal类的divide()除法操作实现了准确的小数位数保留,同时利用向上进位模式实现了四舍五入操作。


注:此文章只是在学习过程中为加深自身理解做的笔记,其中有些方法已经被已经被弃用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

窝在角落里学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值