如何检查一个零是正还是负?

有没有可能检查 float是正零(0.0)还是负零(-0.0) ?

我已经把 float转换成了 String,并且检查了第一个 char是否是 '-',但是还有其他的方法吗?

17953 次浏览

是的,除以它。1 / +0.0f+Infinity,但 1 / -0.0f-Infinity。通过一个简单的比较,很容易找出是哪一个,所以你会得到:

if (1 / x > 0)
// +0 here
else
// -0 here

(这里假设 x只能是两个零中的一个)

您可以使用 Float.floatToIntBits将其转换为 int并查看位模式:

float f = -0.0f;


if (Float.floatToIntBits(f) == 0x80000000) {
System.out.println("Negative zero");
}

绝对不是最好的方法,看看这个函数

Float.floatToRawIntBits(f);

杜库:

/**
* Returns a representation of the specified floating-point value
* according to the IEEE 754 floating-point "single format" bit
* layout, preserving Not-a-Number (NaN) values.
*
* <p>Bit 31 (the bit that is selected by the mask
* {@code 0x80000000}) represents the sign of the floating-point
* number.
...
public static native int floatToRawIntBits(float value);

Math.min采用的方法与 Jesper 的提议类似,但更为明确:

private static int negativeZeroFloatBits = Float.floatToRawIntBits(-0.0f);


float f = -0.0f;
boolean isNegativeZero = (Float.floatToRawIntBits(f) == negativeZeroFloatBits);

当浮点数为负数时(包括 -0.0-inf) ,它使用与负整数相同的符号位。这意味着您可以将整数表示与 0进行比较,从而无需知道或计算 -0.0的整数表示:

if(f == 0.0) {
if(Float.floatToIntBits(f) < 0) {
//negative zero
} else {
//positive zero
}
}

这比已接受的答案多了一个分支,但我认为没有十六进制常数更易读。

如果你的目标只是把 -0看作一个负数,那么你可以省略掉外部的 if语句:

if(Float.floatToIntBits(f) < 0) {
//any negative float, including -0.0 and -inf
} else {
//any non-negative float, including +0.0, +inf, and NaN
}

在 Java 中,Double.equals 区分 ± 0.0(还有 Float.equals)

我有点惊讶没有人提到这些,因为在我看来,它们比迄今为止给出的任何方法都要清楚!

负面评价:

new Double(-0.0).equals(new Double(value));

积极的方面:

new Double(0.0).equals(new Double(value));

只要使用 Double.ゑ(d1,d2)。

double d1 = -0.0;    // or d1 = 0.0


if ( Double.compare (d1, 0.0)  < 0 )
System.out.println("negative zero");
else
System.out.println("positive zero");