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

Java中如何判断BigDecimal除法是否除不尽并按需保留小数?

解决Java BigDecimal除法按需保留小数的问题

核心思路是先尝试精确除法判断是否能除尽,若除不尽则按指定精度处理,尽可能减少信息丢失:

实现步骤

  • 优先调用BigDecimal.divide(BigDecimal divisor)执行精确除法,若未抛出ArithmeticException,说明能除尽,直接返回结果
  • 若抛出异常,说明是无限循环小数,此时使用指定精度(比如4位)和合适的舍入模式执行除法

代码实现

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

public class BigDecimalDivisionUtil {
    // 自定义除不尽时保留的小数位数
    private static final int DEFAULT_SCALE = 4;
    // 默认采用四舍五入模式
    private static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_UP;

    public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor) {
        try {
            // 尝试精确除法,能除尽直接返回
            return dividend.divide(divisor);
        } catch (ArithmeticException e) {
            // 除不尽时按设定规则处理
            return dividend.divide(divisor, DEFAULT_SCALE, DEFAULT_ROUNDING_MODE);
        }
    }

    public static void main(String[] args) {
        BigDecimal one = new BigDecimal("1");
        BigDecimal four = new BigDecimal("4");
        BigDecimal three = new BigDecimal("3");

        // 测试能除尽的场景
        BigDecimal result1 = divide(one, four);
        System.out.println("1/4 = " + result1); // 输出 0.25

        // 测试除不尽的场景
        BigDecimal result2 = divide(one, three);
        System.out.println("1/3 = " + result2); // 输出 0.3333
    }
}

补充说明

  • 可根据业务需求调整DEFAULT_SCALE的数值,比如需要保留更多小数位就增大该值
  • 舍入模式可按需选择,比如ROUND_DOWN(直接截断)、ROUND_CEILING(向上取整)等,默认四舍五入适配多数常规场景
  • 构造BigDecimal时建议使用字符串参数,避免浮点数自带的精度误差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:12:38