Java 的 BigDecimal 是什么?

Java 的 BigDecimal 是什么?

重要内容

BigDecimal 是 Java 中用于高精度浮点数运算的类,属于 java.math 包。它提供了比基本数据类型(如 floatdouble)更高精度的浮点数表示,特别适用于财务计算、科学计算等需要精确结果的场景

主要特点

  1. 精度高BigDecimal 可以处理任意精度的数值
  2. 不可变性BigDecimal 是不可变类,任何运算操作都会返回一个新的 BigDecimal 对象,而不会修改原来的对象
  3. 高精度的数学运算BigDecimal 支持加、减、乘、除等运算,并且可以设置精度和舍入模式

扩展知识

为什么使用 BigDecimal

Java 中的 floatdouble 类型虽然可以存储浮点数,但由于它们使用二进制表示,无法精确表示所有十进制数,这可能导致精度丢失或舍入误差。而 BigDecimal 可以进行精确的计算,避免这种精度问题

如何创建BigDecimal对象?

  • 使用字符串(推荐方式,因为字符串可以精确表示数值)

    java 复制代码
    BigDecimal num = new BigDecimal("13.14");
  • 使用数值(不推荐,因为double和float有精度问题)

    ini 复制代码
    BigDecimal num2 = new BigDecimal(13.14); // 可能会引入精度问题
  • 使用 BigDecimal.valueOf 方法(推荐方式)

    ini 复制代码
    BigDecimal num3 = BigDecimal.valueOf(13.14);

常见方法

add:加法运算
java 复制代码
public class BigDecimalExample {
    public static void main(String[] args) {
        // 使用字符串初始化 BigDecimal 对象
        BigDecimal num1 = new BigDecimal("10.5");
        BigDecimal num2 = new BigDecimal("4.3");
        
        // 加法运算
        BigDecimal sum = num1.add(num2);
        System.out.println("Sum: " + sum);  // Output: Sum: 14.8
    }
}
subtract:减法运算
java 复制代码
public class BigDecimalExample {
    public static void main(String[] args) {
        // 使用字符串初始化 BigDecimal 对象
        BigDecimal num1 = new BigDecimal("10.5");
        BigDecimal num2 = new BigDecimal("4.3");
        
        // 减法运算
        BigDecimal difference = num1.subtract(num2);
        System.out.println("Difference: " + difference);  // Output: Difference: 6.2
    }
}
multiply:乘法运算
java 复制代码
public class BigDecimalExample {
    public static void main(String[] args) {
        // 使用字符串初始化 BigDecimal 对象
        BigDecimal num1 = new BigDecimal("10.5");
        BigDecimal num2 = new BigDecimal("4.3");
        
        // 乘法运算
        BigDecimal product = num1.multiply(num2);
        System.out.println("Product: " + product);  // Output: Product: 45.15
    }
}
divide:除法运算(可以指定精度和舍入模式)
java 复制代码
public class BigDecimalExample {
    public static void main(String[] args) {
        // 使用字符串初始化 BigDecimal 对象
        BigDecimal num1 = new BigDecimal("10.5");
        BigDecimal num2 = new BigDecimal("4.3");
        
        // 除法运算,指定舍入模式和精度
        BigDecimal quotient = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
        System.out.println("Quotient: " + quotient);  // Output: Quotient: 2.44
    }
}
setScale:设置小数点后的位数和舍入模式

常见的舍入模式

  • BigDecimal.ROUND_UP:总是向远离零的方向舍入
  • BigDecimal.ROUND_DOWN:总是向零的方向舍入
  • BigDecimal.ROUND_HALF_UP:四舍五入
  • BigDecimal.ROUND_HALF_DOWN:五舍六入

注意事项

  • 《阿里巴巴Java开发手册》中提到:浮点数之间的等值判断,基本数据类型不能用 == 来比较,包装数据类型不能用 equals 来判断

    BigDecimal 的等值比较应使用 compareTo 方法

相关推荐
蓝澈112122 分钟前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构
Kali_0729 分钟前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费
rzl0241 分钟前
java web5(黑马)
java·开发语言·前端
时序数据说44 分钟前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb
君爱学习1 小时前
RocketMQ延迟消息是如何实现的?
后端
guojl1 小时前
深度解读jdk8 HashMap设计与源码
java
Falling421 小时前
使用 CNB 构建并部署maven项目
后端
guojl1 小时前
深度解读jdk8 ConcurrentHashMap设计与源码
java
程序员小假1 小时前
我们来讲一讲 ConcurrentHashMap
后端