首页 > 编程笔记 > Java笔记 阅读:3

Java BigDecimal类的用法(附带实例)

Java 程序中,BigDecimal 类和 BigInteger 类都能实现大数字的运算,不同的是 BigDecimal 类加入了小数的概念。

一般的 float 型和 double 型数据只可以用来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高,因此要使用 BigDecimal 类。

BigDecimal 类支持任何精度的定点数,可以用它来精确计算货币值。在 BigDecimal 类中,常用的两个构造方法如下表所示。

表 1 BigDecimal类中的常用构造方法
构造方法 功能说明
BigDecimal(double val) 实例化时将双精度浮点型转换为 BigDecimal 类型
BigDecimal(String val) 实例化时将字符串形式转换为 BigDecimal 类型

BigDecimal 类型的数字可以用来做超大的浮点数的运算,如加、减、乘、除等,但是在所有的运算中除法是最复杂的,因为在除不尽的情况下商的小数点后的末位数字的处理是需要考虑的。

BigDecimal 类实现的加、减、乘、除的方法如下表所示:

表 2 BigDecimal类实现的加、减、乘、除的方法
方法 功能说明
add(BigDecimal augend) 做加法操作
subtract(BigDecimal subtrahend) 做减法操作
multiply(BigDecimal multiplicand) 做乘法操作
divide(BigDecimal divisor, int scale, RoundingMode roundingMode) 做除法操作,方法中 3 个参数分别代表除数、商的小数点后的位数、近似处理模式

在上述方法中,BigDecimal 类中的 divide() 方法有多种设置,用于返回商的小数点后的末位数字的处理,这些模式的名称与含义如下表所示。

表 3 BigDecimal 类中的 divide() 方法的多种处理模式
模式 含义
RoundingMode.UP 商的最后一位如果大于 0,则向前进位,正负数都如此
RoundingMode.DOWN 商的最后一位无论是什么数字都省略
RoundingMode.CEILING 如果商是正数,则按照 UP 模式处理;如果商是负数,则按照 DOWN 模式处理。这种模式的处理都会使近似值大于或等于实际值
RoundingMode.FLOOR 与 CEILING 模式相反:商如果是正数,按照 DOWN 模式处理;商如果是负数,则按照 UP 模式处理。这种模式的处理都会使近似值小于或等于实际值
RoundingMode.HALF_DOWN 对商进行四舍五入操作:如果商最后一位小于或等于 5,则做舍弃操作;如果最后一位大于 5,则做进位操作,如 7.5 ≈ 7
RoundingMode.HALF_UP 对商进行四舍五入操作:如果商的最后一位小于 5,则做舍弃操作;如果大于或等于 5,则做进位操作,如 7.5 ≈ 8
RoundingMode.HALF_EVEN 如果商的倒数第二位为奇数,则按照 HALF_UP 模式处理;如果为偶数,则按照 HALF_DOWN 模式处理,如 7.5 ≈ 8,8.5 ≈ 8

下面设计一个类,这个类包括任意两个 BigDecimal 类型数字的加、减、乘、除运算方法。

【实例】使用 BigDecimal 类进行数学运算。在项目中创建 BigDecimalDemo 类,然后在类的主方法中创建两个 BigDecimal 类对象,再对两个对象进行加、减、乘、除运算,最后输出运算结果。
import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalDemo {
    public static void main(String[] args) {
        BigDecimal b1 = new BigDecimal("0.009876543219876543211"); // 第 1 个大小数
        BigDecimal b2 = new BigDecimal("0.0012345678912345678"); // 第 2 个大小数
        System.out.println("两个数字相加结果:" + b1.add(b2)); // 加法运算
        System.out.println("两个数字相减结果:" + b1.subtract(b2)); // 减法运算
        System.out.println("两个数字相乘结果:" + b1.multiply(b2)); // 乘法运算
        // 除法运算,商小数点后保留 9 位,并对结果进行四舍五入操作
        System.out.println("两个数字相除,保留小数点后 9 位:" + b1.divide(b2, 9, RoundingMode.HALF_UP));
    }
}
运行结果如下:
两个数字相加结果:0.01111111111111111110
两个数字相减结果:0.00864197532864197532
两个数字相乘结果:0.0000121932631356500531347203169112635269
两个数字相除,保留小数点后9位:8.000000073

相关文章