gpt4 book ai didi

java - +0 和 -0 显示 int 和 float 数据的不同行为

转载 作者:行者123 更新时间:2023-12-04 00:08:25 25 4
gpt4 key购买 nike

我已经阅读了这篇文章 negative and positive zero .

根据我的理解,以下代码应该给出 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));
}
}

为什么我们对 Integer 的 0 有不同的行为和 Float ?

最佳答案

Ints 和 floats 在 Java 中是完全不同的野兽。整数被编码为 two's complement ,它有一个 0 值。花车使用 IEEE 754 (32-bit variant 用于 float ,64-bit 用于 double )。 IEEE 754 有点复杂,但出于此答案的目的,您只需要知道它包含三个部分,其中第一个是符号位。这意味着对于任何 float ,都有一个积极和消极的变体¹。这包括 0,所以浮点数实际上有两个“零”值,+0 和 -0。

顺便说一句,int 使用的二进制补码并不是计算机科学中对整数进行编码的唯一方法。还有其他方法,比如 ones' complement ,但它们有一些怪癖——比如将 +0 和 -0 作为不同的值。 ;-)

当您比较浮点基元(和 double 数)时,Java 将 +0 和 -0 视为相等。但是当你把它们装箱时,Java 将它们分开处理,如 Float#equals 中所述。 .这让 equals 方法与它们的 hashCode 保持一致。实现(以及 compareTo ),它只使用浮点数的位(包括带符号的值)并将它们按原样插入 int 中。

他们本可以为 equals/hashCode/compareTo 选择其他选项,但他们没有。我不确定那里的设计考虑是什么。但至少在一方面,Float#equals总是会偏离浮点基元的 == :在原语中,NaN != NaN ,但是 for all objects, o.equals(o) must also be true .这意味着如果你有 Float f = Float.NaN ,然后 f.equals(f)即使 f.floatValue() != f.floatValue() .

¹ NaN(非数字)值有一个符号位,但除了排序之外没有任何意义,Java 忽略它(即使是排序)。

关于java - +0 和 -0 显示 int 和 float 数据的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59279971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com