我已阅读这篇文章阴性和阳性零。
据我了解下面的代码应该给true
和true
作为输出。
然而,它给false
并true
作为输出。
我有一个积极的零比较负零。
public class Test {
public static void main(String[] args) {
float f = 0;
float f2 = -f;
Float F = new Float(f);
Float F1 = new Float(f2);
System.out.println(F1.equals(F));
int i = 0;
int i2 = -i;
Integer I = new Integer(i);
Integer I1 = new Integer(i2);
System.out.println(I1.equals(I));
}
}
为什么我们有0对不同的行为Integer
和Float
?
整型和浮点型在Java非常不同的东西。INTS被编码为二进制补码,其中有一个0值。浮子使用IEEE 754(在32位变体为浮点数,和64位为双打)。IEEE 754是有些复杂,但对于这个答案的目的,你只需要知道它有三个部分,其中第一个是符号位。这意味着对于任何浮动,有一个正面和负面variant¹。这包括0,所以彩车实际上有两个“零”的价值观,+0和-0。
顺便说一句,在两个补是整数的使用是不是在计算机科学整数编码的唯一途径。还有其他的方法,如的补,但他们有怪癖-喜欢既具有+0和-0是不同的值。;-)
当你比较浮法原语(双打),爪哇把+0和-0相等。但是,当你盒子里,Java的分别对待他们,如描述Float#equals
。这让equals方法是用自己一贯的hashCode
执行(以及compareTo
),它只是用浮子的位(包括符号值),并把它塞作为,是为一个int。
他们可以挑选一些其他选项的equals /的hashCode /的compareTo,但他们没有。我不知道什么样的设计考虑有。但至少在一个方面,Float#equals
总是会从浮子原始的发散==
:在原语,NaN != NaN
但对于所有的对象,o.equals(o)
也必须是真实的。这意味着,如果你有Float f = Float.NaN
,那么f.equals(f)
即使f.floatValue() != f.floatValue()
。
¹NaN(非-A-数)值有一个符号位,但它并没有比排序任何其他意思,和Java忽略它(即使是排序)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句