在JBox2d中,存在以下代码Vec2.equals()
:
@Override
public boolean equals(Object obj) { //automatically generated by Eclipse
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Vec2 other = (Vec2) obj;
if (Float.floatToIntBits(x) != Float.floatToIntBits(other.x))
return false;
if (Float.floatToIntBits(y) != Float.floatToIntBits(other.y))
return false;
return true;
}
我想知道这里的float <->
int位转换函数的作用是什么。这是否提供解决Java的float比较不准确性问题的方法(如果可能的话)?还是完全不同?我想知道它是否可以替代epsilon方法:
if (Math.abs(floatVal1 - floatVal2) < epsilon)
PS。为了完整和有趣,这里是Vec2.hashCode()
:
@Override
public int hashCode() { //automatically generated by Eclipse
final int prime = 31;
int result = 1;
result = prime * result + Float.floatToIntBits(x);
result = prime * result + Float.floatToIntBits(y);
return result;
}
仅供参考,我可以完美地理解为什么在hashCode()中使用转换函数-哈希ID必须是整数。
解释中可以找到约书亚Bloch的Effective
Java的
:float
和Float
需要,因为存在的特殊待遇-0.0
,NaN
,正无穷大,和负无穷大。这就是为什么Sun
JVM Float.equals()
看起来像这样(6u21):
public boolean equals(Object obj)
{
return (obj instanceof Float)
&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
因此,不行,Math.abs()
使用ε并不是一个很好的选择。从Javadoc:
如果f1和f2都表示Float.NaN,则即使Float.NaN ==
Float.NaN的值为false,equals方法也将返回true。如果f1表示+ 0.0f,而f2表示-0.0f,反之亦然,即使0.0f
==-0.0f的值为true,相等测试的值为false。
这就是Eclipse自动生成的代码为您做到这一点的原因。
有一个JavaBean汽车可能包含两个值:model和price。 现在假设我以这种方式重写equals()和hashcode()只检查模型: 这允许我检查arraylist是否已经包含同一型号的商品车(价格不重要),方法如下: 这是真的。没关系,因为汽车已经存在了! 但是现在我认为ArrayList不好,因为我想维护订购的项目,所以我用树集替换它,如下所示: }}); 但现在有一个问题,它返回F
当我跑的时候 在shell中,它返回。为什么?它应该是?当我跑的时候 它返回。
为什么,给定: 这是否不安全: 但这是安全的: 我所说的安全是指保证不受溢出的影响(我正在编写一个整数的)。
问题内容: 我发现该方法的实现如下所示: 问题是为什么使用比较而不是减法: 问题答案: 这是由于整数溢出。当非常大且为负数时,则从前者中减去后者会产生大于可能溢出至负数范围的结果。
问题内容: 无论如何,要使下面的代码仍然使用开关,而不返回它,是吗?谢谢! 当然,如果使用if语句,您将像这样: 但是对于更复杂的示例,这变得很冗长。 问题答案: 抱歉,根据switch()文档 ,您不能在switch语句中使用比较: 请注意,开关/外壳确实比较松散。 这意味着您必须提出解决方法。从松散的比较表 ,你可以利用的事实是类型转换错误:
问题内容: 输出: 为什么这样的输出?我期望作为第一种情况的结果。 问题答案: 区别在于6.5可以完全以float和double表示,而3.2不能完全以两种类型表示。并且两个最接近的近似是不同的。 float和double之间的相等比较首先将float转换为double,然后将两者进行比较。因此数据丢失。 您不应该比较浮点数或双精度数是否相等。因为您不能真正保证分配给float或double的数字