如何检查零是正面还是负面?

是否有可能检查float是否为正零(0.0)或负零(-0.0)?

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

是的,除以它。 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"); } 

绝对不是最好的答案。 检查function

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

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

我感到有些惊讶,没有人提到这些,因为他们看起来比我们迄今为止给出的方法更清晰!

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

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

这在接受的答案上有一个额外的分支,但是我认为没有hex常量的情况下它更具可读性。

如果你的目标是把-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 } 

从ES6开始,你可以使用Object.is() 。 这个比较详细一些,但比顶部答案(1/x < 0)更清晰和更强大。

 Object.is(-0,-0); // true Object.is(0,-0); // false 

不知道Java,但在其他语言,例如C / C ++最合适的方式是:

 inline bool IsNegativeZero(float fl) { return (fl & 0x80000000); } inline bool IsPozitiveZero(float fl) { return (fl & 0x00000000); } 

这种方式是有效的,因为IEEE-754描述了浮点数的MSB(最高有效位)决定它的正值还是负值,其他位表示值。


我把它称为最合适的,因为它需要最less的CPU周期来检查它。

对于否定的:

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

对于积极的:

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