如何在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); } }
代码说明
- 精度保障:使用字符串构造BigDecimal,避免
double类型的精度丢失问题(例如new BigDecimal(3.10)会因double精度问题变成近似值)。 - 小数部分提取:
scale()获取BigDecimal的小数位数;unscaledValue()获取去掉小数点后的整数值(例如3.10的unscaledValue是310);- 通过
remainder(BigInteger.TEN.pow(scale))得到小数部分对应的整数值(例如310 % 100 = 10,对应3.10的小数部分数值)。
- 排序逻辑:比较两个BigDecimal的小数部分整数值,按升序排列,最终得到预期的排序结果。
输出结果
运行代码后,输出如下:
3.2 3.9 3.10 3.12 3.17
内容的提问来源于stack exchange,提问作者karthik patel
相关产品推荐
相关产品推荐

