java原语双值相等取决于大小?
我必须检查两个双精度值是否相等,包括大小和精度。我遇到了一个奇怪的场景,在这个场景中,原始的双等于检查是不一致的,并且取决于值的大小
我使用过的Java版本:
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)
我的代码:
public class Test{
public static void main(String args[]) throws Exception{
String val1 = "15.999999999999999";
String val2 = "16";
String val3 = "16.999999999999999";
String val4 = "17";
double d1 = Double.parseDouble(val1);
double d2 = Double.parseDouble(val2);
double d3 = Double.parseDouble(val3);
double d4 = Double.parseDouble(val4);
System.out.println(val1 + "=" + val2 + "? ===>" + (d1==d2));
System.out.println(val3 + "=" + val4 + "? ===>" + (d3==d4));
}
}
输出:
15.999999999999999=16? ===>false
16.999999999999999=17? ===>true
# 1 楼答案
比较双精度或浮点值时不要使用==
而是使用Double。比较http://download.oracle.com/javase/6/docs/api/java/lang/Double.html
和浮动。比较浮点数
# 2 楼答案
浮点数是近似值。它们可能有一组有限的离散值。通过解析字符串创建浮点数时,将选择最接近的浮点数来表示它
最接近15.999999999999的双精度是15.999999999998,而不是16.0,因此比较是不相等的。但是17.0是最接近16.99999999999的两倍,所以它们比较相等
# 3 楼答案
由于各种无聊和复杂的原因,你试图做的事情不会奏效,你可以在这里读到:http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
除非您要比较double的位表示(这可能是有见地的,也可能不是有见地的),否则您将始终需要某种epsilon值,即在处理数字的浮点表示时的误差范围。比如: