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

