如何检查零是正还是负?

时间:2014-03-14 15:20:10

标签: java floating-point zero

是否可以检查float是正零(0.0)还是负零(-0.0)?

我已将float转换为String,并检查了第一个char是否为'-',但还有其他方式吗?

8 个答案:

答案 0 :(得分:79)

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

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

(这假设x只能是两个零之一)

答案 1 :(得分:36)

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

float f = -0.0f;

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

答案 2 :(得分:11)

绝对不是最好的方法。签出功能

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);

答案 3 :(得分:7)

Math.min使用的方法类似于Jesper提出的方法,但更清楚一点:

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

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

答案 4 :(得分:7)

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

我有点惊讶没有人提到这些,因为他们看起来比我到目前为止给出的方法更清楚了!

答案 5 :(得分:6)

当浮点数为负数(包括-0.0-inf)时,它使用相同的符号位作为负数int。这意味着您可以将整数表示与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
}

答案 6 :(得分:0)

否定:

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

积极的:

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

答案 7 :(得分:0)

只需使用 Double.compare (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");