+0和-0显示不同的行为对于int和浮点数据

小丑:

我已阅读这篇文章阴性和阳性零

据我了解下面的代码应该给truetrue作为输出。

然而,它给falsetrue作为输出。

我有一个积极的零比较负零。

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对不同的行为IntegerFloat

yshavit:

整型和浮点型在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章