String字符串的compareTo比较出现的问题bug记录

String字符串大小比较问题 java


此篇博客用于记录一点小bug。

问题描述

提示:这里描述项目中遇到的问题:

在用Java做项目的时候,有一个对浮点数进行大小排序的需求,但是需要对浮点数的小数位数做规范(这里规定为小数后两位),于是采用了String.format("%.2f", dailyGameCount)的规范方式,但是这个函数的返回结果类型是String。在用compareTo的比较方式进行集合排序的部分代码如下:

else if (sortType == ActivitySortType.USER_GAME_COUNT_ASC) {
            townUserActivityDtoList.sort((o1, o2) -> o1.getDailyGameCount().compareTo(o2.getDailyGameCount()));
        } else if (sortType == ActivitySortType.USER_GAME_COUNT_DESC) {
            townUserActivityDtoList.sort((o1, o2) -> o2.getDailyGameCount().compareTo(o1.getDailyGameCount()));
        }
	}

导致的结果就是:dailyGameCount="9.71"的对象属性大于在dailyGameCount="22.30"的对象属性。很显然,这是不对的。


原因分析:

具体测试代码如下:

    public static void main(String[] args) {
        String s1 = "0.00";
        String s2 = "0";
        System.out.println(s1==s2); //对象的内存地址比较,很显然不同对象值不相同
        System.out.println(s2.equals(s1));  //对象的字符比较,0与0.00长度不一样
        System.out.println(s1.compareTo(s1));   //对象逐个从左往右比较,返回差值,s1>s2,返回正数;s1==s2,返回0,否则返回负数
        System.out.println(Double.valueOf(s1)==(Double.valueOf(s2)));
        System.out.println(Double.valueOf(s1).equals(Double.valueOf(s2)));
        String s3 = "9.75";
        String s4 = "22.30";
        System.out.println(s3.compareTo(s4));

    }

测试结果,重点在最后一个测试输出,说明9.75大于22.30,问题找到。
String字符串的compareTo比较出现的问题bug记录_第1张图片


解决方案:

所以,为了防止这种问题发生,在实际需求本来就是要针对数字类型的大小比较的时候,那么就统统把String类型转为浮点类型。此处我采用的解决方式为:

	Double.valueOf(String s);

将字符串类型的变量改为数字类型。

你可能感兴趣的:(后端开发,java,maven,spring,spring,boot)