java float equals,Java快equals方法對於float類型

據我所知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'的有效定義。 –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值