在测试过程中,经常会遇到有需要进行数值比较的地方,这个比较的数值用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()方法;