據我所知set.add使用等於FastFloatJava快equals方法對於float類型
的方法對我來說,重要的只有前兩個數字點之後(!),所以在equals方法,使等於更快的I使用Math.abs() >= 0.001但我不明白爲什麼這個代碼回報2而不是1因爲Math.abs(3.54 - 3.5405) < 0.001
代碼:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class st {
public class FastFloat {
private float ff;
public FastFloat(float ff) {
super();
this.ff = ff;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + getOuterType().hashCode();
result = prime * result + Float.floatToIntBits(ff);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof FastFloat))
return false;
FastFloat other = (FastFloat) obj;
if (!getOuterType().equals(other.getOuterType()))
return false;
/* if (Float.floatToIntBits(ff) != Float.floatToIntBits(other.ff))
return false;*/
if (Math.abs(ff - other.ff) >= 0.001)
return false;
return true;
}
private st getOuterType() {
return st.this;
}
}
public static void main(String[] args) {
List> lsff = new ArrayList<>();
lsff.add(0, new HashSet<>());
Set sff = lsff.get(0);
st x = new st();
sff.add(x.new FastFloat((float)3.54));
sff.add(x.new FastFloat((float)3.5405));
System.out.println(lsff.get(0).size());
}
}
+0
計算機中的浮點數不具有無限精度,可能會導致類似這樣的情況。這是一個二進制表示。因此3.54實際上可以與3.5399999999 –
+0
相同因爲你的.hashCode(它不截斷爲3位數字)與.equals()方法不匹配 –
+0
這不是'equals'的有效定義。 –