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

如何在Java中按小数部分排序BigDecimal序列?

按BigDecimal的小数部分数值排序的Java实现

要实现按小数点后的数值排序,核心是提取每个BigDecimal的小数部分对应的整数值,再比较这些整数值的大小。下面是具体实现:

实现代码

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class BigDecimalDecimalPartSort {
    public static void main(String[] args) {
        // 注意:必须用字符串构造BigDecimal,避免double精度丢失问题
        List<BigDecimal> numbers = Arrays.asList(
                new BigDecimal("3.2"),
                new BigDecimal("3.10"),
                new BigDecimal("3.12"),
                new BigDecimal("3.17"),
                new BigDecimal("3.9")
        );

        // 自定义比较器,按小数部分的数值升序排序
        Comparator<BigDecimal> decimalPartComparator = (bd1, bd2) -> {
            // 计算第一个数的小数部分数值
            int scale1 = bd1.scale();
            BigInteger unscaled1 = bd1.unscaledValue();
            BigInteger decimalPart1 = unscaled1.remainder(BigInteger.TEN.pow(scale1));

            // 计算第二个数的小数部分数值
            int scale2 = bd2.scale();
            BigInteger unscaled2 = bd2.unscaledValue();
            BigInteger decimalPart2 = unscaled2.remainder(BigInteger.TEN.pow(scale2));

            // 比较小数部分数值
            return decimalPart1.compareTo(decimalPart2);
        };

        // 执行排序
        numbers.sort(decimalPartComparator);

        // 输出结果
        numbers.forEach(System.out::println);
    }
}

代码说明

  1. 精度保障:使用字符串构造BigDecimal,避免double类型的精度丢失问题(例如new BigDecimal(3.10)会因double精度问题变成近似值)。
  2. 小数部分提取:
    • scale()获取BigDecimal的小数位数;
    • unscaledValue()获取去掉小数点后的整数值(例如3.10的unscaledValue是310);
    • 通过remainder(BigInteger.TEN.pow(scale))得到小数部分对应的整数值(例如310 % 100 = 10,对应3.10的小数部分数值)。
  3. 排序逻辑:比较两个BigDecimal的小数部分整数值,按升序排列,最终得到预期的排序结果。

输出结果

运行代码后,输出如下:

3.2
3.9
3.10
3.12
3.17

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:15:32