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解释下根本原因,优化下代码捏?


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即可解决。(虽然不知道为甚)