BigDecimal用法示例

BigDecimal用法示例

文章目录

  • BigDecimal用法示例
    • [1. 加法:`add`](#1. 加法:add)
    • [2. 减法:`subtract`](#2. 减法:subtract)
    • [3. 乘法:`multiply`](#3. 乘法:multiply)
    • [4. 除法:`divide`](#4. 除法:divide)
    • [5. 小数位数控制:`setScale`](#5. 小数位数控制:setScale)
    • [6. 注意事项](#6. 注意事项)
    • 总结示例

BigDecimal 是 Java 中用于高精度数值计算的类,尤其适合金融和货币计算,避免了浮点数的精度误差。下面是 BigDecimal 进行加减乘除的基本用法和注意事项。


1. 加法:add

java 复制代码
javaBigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("2.3");

BigDecimal result = a.add(b);  // 10.5 + 2.3 = 12.8

2. 减法:subtract

java 复制代码
javaBigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("2.3");

BigDecimal result = a.subtract(b);  // 10.5 - 2.3 = 8.2

3. 乘法:multiply

java 复制代码
javaBigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("2.3");

BigDecimal result = a.multiply(b);  // 10.5 * 2.3 = 24.15

4. 除法:divide

除法是 BigDecimal 的难点,因为除法有可能会产生无限循环小数,需要指定舍入模式和精度。

java 复制代码
javaBigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("3");

BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP);  // 保留2位小数,四舍五入
// 10.5 / 3 = 3.50

说明:

  • 第二个参数 2 是保留的小数位数(scale)
  • 第三个参数是舍入模式,比如常用的:
    • RoundingMode.HALF_UP --- 四舍五入
    • RoundingMode.DOWN --- 直接截断
    • RoundingMode.HALF_EVEN --- 银行家舍入法

5. 小数位数控制:setScale

可以对结果进行小数位数的控制和舍入:

java 复制代码
javaBigDecimal value = new BigDecimal("12.34567");

// 保留两位小数,四舍五入
BigDecimal scaledValue = value.setScale(2, RoundingMode.HALF_UP);  // 12.35

6. 注意事项

  • BigDecimal 的构造建议传入字符串或 long/double 的 valueOf,避免直接用 new BigDecimal(double) 因为可能带来精度误差:

    java 复制代码
    javanew BigDecimal("0.1");           // 推荐
    BigDecimal.valueOf(0.1);         // 推荐
    new BigDecimal(0.1);             // 不推荐,可能得到0.10000000000000000555
  • BigDecimal 对象是不可变的,所有操作都会返回一个新的 BigDecimal,原对象不变。


总结示例

java 复制代码
javaimport java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalDemo {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("10.5");
        BigDecimal b = new BigDecimal("3");

        BigDecimal sum = a.add(b);
        BigDecimal diff = a.subtract(b);
        BigDecimal mul = a.multiply(b);
        BigDecimal div = a.divide(b, 2, RoundingMode.HALF_UP);

        System.out.println("加法: " + sum);      // 13.0
        System.out.println("减法: " + diff);     // 7.5
        System.out.println("乘法: " + mul);      // 31.5
        System.out.println("除法: " + div);      // 3.50
      
      double amount = mallProcureOrderDetailBOList.stream()
                                .map(record ->
                                                    BigDecimal.valueOf(record.getCommodityPrice()).multiply(BigDecimal.valueOf(record.getQuantity())))
                                .reduce(BigDecimal.ZERO, BigDecimal::add)
                                .setScale(2, RoundingMode.HALF_UP).doubleValue();
                System.out.println("java8 stream 加法: " + amount);             
      
    }
}
相关推荐
2601_962106643 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
RuoyiOffice4 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
2601_962106644 小时前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
czq_26867194874 小时前
Python打卡第46天
开发语言·python
RuoyiOffice4 小时前
KubeSphere 容器云实践:从管理 K8s 到建设企业 PaaS,还需要哪些能力
spring boot·kubernetes·kubesphere·jenkins·paas·微服务部署·ruoyi office
杨凯凡5 小时前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard5 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android5 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤5 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
Evand J7 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波