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 方法

相关推荐
月华路22 分钟前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
liangshanbo12151 小时前
虚拟列表深度面试题整理
java·开发语言·前端
gugucoding1 小时前
59. 【Java】Spring Boot 入门:第一个 Web 应用
java·开发语言·spring boot
IT_陈寒2 小时前
Redis内存警告竟是因为这个不起眼的配置项
前端·人工智能·后端
Python私教2 小时前
AI 漫剧角色一进分镜就变脸?把提示词升级成“角色 ID + 镜头合同”
后端
Python私教2 小时前
一次生成 20 个角色却全都撞脸:我用“角色合同”重做了批量生成流程
后端
10mAh2 小时前
【Java】HashMap 的 put 到底做了什么?——冲突、扩容与树化实测
java·开发语言·hash
我命由我123452 小时前
人脸识别 - 勒克斯(光线照射到物体表面上的明亮程度)
android·java·学习·java-ee·人脸识别·学习方法·android runtime
用户594404103563 小时前
Go 语言高性能 Web 服务开发:基于 Gin + GORM + Redis 构建 RESTful API
后端
Python私教3 小时前
App 第一版该砍什么?用三问法守住 MVP 的工程底线
后端·mvp