SUpperz 2022-07-16 22:56 采纳率: 50%
浏览 32
已结题

JAVA PTA Basic 1020 月饼,Collection.sort无效排序,double精度问题

问题遇到的现象和发生背景

在写PTA Basic 1020 月饼,进行重写排序时发现,当排序的数据出现无限小数,与无限小数整数部分相同的数,即如4.166666666667与4.5, 2.6999999999与2.800000000000003同时存在时,重写的排序就无法比较。当整数部分不相同时,排序比较又正常。


public class Basic20_2 {
    public static void main(String[] args) {
        ArrayList<MoonCake1> list=new ArrayList<>();
        list.add(new MoonCake1("3","8.1"));
        list.add(new MoonCake1("3","8.4"));
        list.add(new MoonCake1("10","75"));
        System.out.println(list.get(0).danjia>list.get(1).danjia);
        Collections.sort(list, new Comparator<MoonCake1>() {
            @Override
            public int compare(MoonCake1 moonCake1, MoonCake1 t1) {
                if( (int)moonCake1.danjia>(int)t1.danjia){
                    return -1;
                }
                else {
                    return 1;
                }
            }
        });
        System.out.println(list);
    }

}
class MoonCake1 {
    public double kucun;
    public  double shoujia;
    public double  danjia;

    public MoonCake1(String kucun, String shoujia) {
        this.kucun = Double.parseDouble(kucun);
        this.shoujia = Double.parseDouble(shoujia);
//        double sss=this.shoujia/this.kucun;
//        String  str=String.format("%.2f",sss);
//        danjia=Double.parseDouble(str);
        danjia=this.shoujia/this.kucun;
    }

    @Override
    public String toString() {
        return "MoonCake1{" +
                "kucun=" + kucun +
                ", shoujia=" + shoujia +
                ", danjia=" + danjia +
                '}';
    }
}

运行结果及报错内容

img

img


按照单价从大到小排序,当出现上述情况,无限小数部分整数相同,排序就无效。

img


无限小数整数部分不相同时,排序正常

我想要达到的结果

有没有UU解释下根本原因,优化下代码捏?

  • 写回答

1条回答 默认 最新

  • SUpperz 2022-07-16 23:20
    关注
    
    class MoonCake implements Comparable<MoonCake>{
        public double kucun;
        public  double shoujia;
        public double  danjia;
    
        public MoonCake(String kucun, String shoujia) {
            this.kucun = Double.parseDouble(kucun);
            this.shoujia = Double.parseDouble(shoujia);
            danjia=this.shoujia/this.kucun;
        }
    
        @Override
        public String toString() {
            return "MoonCake{" +
                    "kucun=" + kucun +
                    ", shoujia=" + shoujia +
                    ", danjia=" + danjia +
                    '}';
        }
    
        @Override
        public int compareTo(@NotNull MoonCake moonCake) {
            return moonCake.danjia-this.danjia>0?1:-1;
        }
    }
    

    在自定义类实现接口comparable,调用collection.sort即可解决。(虽然不知道为甚)

    评论

报告相同问题?

问题事件

  • 系统已结题 7月24日
  • 创建了问题 7月16日

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题