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

Java实现Comparable按double薪资升序排序时sort方法失效问题

排序失效原因

排序结果不符合预期和double类型存储薪资没有直接关联,核心错误在compareTo方法的比较逻辑:

  • 方法内对两个double类型的薪资值做了(int)强制转换,这个操作会直接截断小数部分,不会做四舍五入,仅保留整数位数值
  • 对照你给出的测试数据:Steve薪资3.1转int后为3,Mark薪资4.2转int后为4,Oliver薪资4转int后为4。比较时只会判定Steve薪资最低排在最前,Mark和Oliver因为整数位差值为0会被判定为薪资相等,二者的相对顺序不会参考小数部分调整,自然无法得到正确的升序结果。
修复方式

直接调用JDK内置的Double类型比较方法即可,不会出现小数截断问题,替换原有compareTo方法的实现:

@Override
public int compareTo(Employee employee) {
    return Double.compare(this.salary, employee.salary);
}

补充说明:如果是涉及金额计算的正式业务场景,确实不推荐用double存储薪资,浮点类型本身存在天然精度误差,这类场景更推荐用BigDecimal类型做金额存储和计算,但本次排序错误的直接诱因不是double的精度问题,是强制类型转换截断数值的逻辑写错了。
修改后运行代码,得到的升序结果为:Steve 3.1, Oliver 4.0, Mark 4.2,完全符合薪资升序排列的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:09:18