Als ich das versucht:Warum HashSet unterscheidet 0,0 und -0,0
HashSet<Double> set = new HashSet<>();
Double d1 = new Double(0);
Double d2 = new Double(0);
Double d3 = new Double(-0);
set.add(d1);
System.out.println(set.contains(d2));
System.out.println(set.contains(d3));
Der Ausgang war das, was ich erwartet hatte:
true
true
Aber als ich versuchte:
HashSet<Double> set = new HashSet<>();
Double d1 = new Double(0.0);
Double d2 = new Double(0.0);
Double d3 = new Double(-0.0);
set.add(d1);
System.out.println(set.contains(d2));
System.out.println(set.contains(d3));
oder
set.add(Double.valueOf(d1));
System.out.println(set.contains(Double.valueOf(d2)));
System.out.println(set.contains(Double.valueOf(d3)));
Zu meiner Überraschung war die Ausgabe:
true
false
Warum dies geschehen? Wie mache ich HashSet treat (0.0) und (-0.0) gleich? Gibt es einen besseren Weg als if(num == -0.0) num = 0.0;
?
Versuchen Sie mit 'Double.valueOf()' anstelle von 'new Double()'? – fge
Es tut es nicht, aber 'Double' tut. – EJP
Das Vergleichen von Fließkommawerten mit == ist in der Tat gefährlich. Tu es nicht. – ncmathsadist