You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Java record中的BigDecimal类型属性设置精度?

Java Record中为BigDecimal属性设置精度的优雅方案

方案1:重写Record的紧凑构造器

这是最直接的实现方式,紧凑构造器不需要重复所有参数,写法简洁:

import java.math.BigDecimal;
import java.math.RoundingMode;

record WorldRecordDto(BigDecimal price) {
    // 紧凑构造器,仅处理需要调整精度的属性
    WorldRecordDto {
        // 按业务需求设置精度,示例为保留4位小数,采用HALF_UP舍入模式
        price = price.setScale(4, RoundingMode.HALF_UP);
    }
}

这种方式直接在Record内部完成精度修正,无需额外类,但如果有多个BigDecimal属性,需要逐个在构造器中处理。

方案2:使用静态工厂方法(推荐大型DTO)

把精度处理逻辑封装到静态工厂方法中,Record的构造器保持默认,对外通过工厂方法创建实例,能让Record定义更简洁,维护更方便:

import java.math.BigDecimal;
import java.math.RoundingMode;

record WorldRecordDto(BigDecimal price) {
    // 静态工厂方法,封装精度处理逻辑
    public static WorldRecordDto of(BigDecimal price) {
        BigDecimal processedPrice = price.setScale(4, RoundingMode.HALF_UP);
        return new WorldRecordDto(processedPrice);
    }
}

// 使用示例
WorldRecordDto dto = WorldRecordDto.of(new BigDecimal("0.000004"));

如果是大型DTO,可以把所有需要处理精度的属性逻辑集中在工厂方法里,甚至抽成工具类复用处理逻辑,避免重复代码。

方案3:自定义注解+编译时处理器(进阶复用)

如果多个Record都需要处理BigDecimal精度,可以自行实现编译时注解处理器:

  1. 定义自定义注解,比如@FixedScale(scale = 4, roundingMode = RoundingMode.HALF_UP)
  2. 编写注解处理器,在编译阶段为带有该注解的BigDecimal属性自动生成精度处理的构造器或工厂方法
    这种方式一劳永逸,但需要额外开发注解处理器代码,适合多项目复用的场景。

内容的提问来源于stack exchange,提问作者user9808476

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:32:28