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
相关产品推荐
相关产品推荐

