数值比较有说头

在测试过程中,经常会遇到有需要进行数值比较的地方,这个比较的数值用String字符串比较,还是数值比较会影响最终的程序结果;下面我们看下这两种比较结果有什么不同:

1.String字符串比较,代码如下:

class StringR {
    String s1 = "2.0";
    String S2 = "2.0";
    public void compare() {
        if (s1.equals(S2)) {
            System.out.println("S1和S2的数值相等");
        } else {
            System.out.println("S1和s2的数值不相等");
        }
    }
}
public class StringE {
    public static void main(String[] args) {
        StringR str = new StringR();
        str.compare();
    }
}
此时运行结果为:
S1和S2的数值相等

下面我们将s2的值增加小数位数,变为2.00即如下代码:

class StringR {
    String s1 = "2.0";
    String S2 = "2.00";//值变为2.00

    public void compare() {
        if (s1.equals(S2)) {
            System.out.println("S1和S2的数值相等");
        } else {
            System.out.println("S1和s2的数值不相等");
        }
    }
}

public class StringE {
    public static void main(String[] args) {
        StringR str = new StringR();
        str.compare();
    }
}
此时运行结果为:
S1和s2的数值不相等

此时从数值上看,2.0和2.00没有多大区别,都是2,但是从字符串做比较的角度看,不难看出,此时用equals()方法比较的是字符串内容,此时肯定不相等;

 那为了避免出现这种比较差异,我们尽量用数值比较,此时便不会有这样的问题,看下面代码:

class Number {
    String s1 = "2.0";
    String s2 = "2.0000";

    public void compare() {
        if ((new BigDecimal(s1)).compareTo(new BigDecimal(s2)) == 0) {
            System.out.println("两数值相等");
        } else {
            System.out.println("两数值不相等");
        }
    }
}

public class NumberDemo {

    public static void main(String[] args) {
        Number n = new Number();
        n.compare();
    }

}
此时运行结果为:两数值相等

此时我们无论将s2设置为包含多少位小数,只要数值2不变,那么比较出来的值就永远相等;

故在测试的时候:遇到数据类型为字符串,但是值却为数字组成的时候,此时如果将此值和预期做比较,那么一定要使用conpareTo()。而不能想当然的使用equals()方法;

原文地址:https://www.cnblogs.com/haibaowang/p/9540959.html