是否可以检查afloat
是正零(0.0)还是负零(-0.0)?
我已经将转换为float
,String
并检查第一个char
是否为'-'
,但是还有其他方法吗?
是否可以检查afloat
是正零(0.0)还是负零(-0.0)?
我已经将转换为float
,String
并检查第一个char
是否为'-'
,但是还有其他方法吗?
Answers:
是的,除以它。1 / +0.0f
是+Infinity
,但是1 / -0.0f
是-Infinity
。通过简单的比较很容易找出是哪一个,因此您得到:
if (1 / x > 0)
// +0 here
else
// -0 here
(这假定x
只能是两个零之一)
if (math.copySign (1.0, x) < 0.0) ...
math.copySign(1.0,x)<0.0
比哪个更“容易” 1/x>0
。我的意思是,两者都非常不言自明,因此无论如何您都想拥有一个功能
您可以使用Float.floatToIntBits
将其转换为int
并查看位模式:
float f = -0.0f;
if (Float.floatToIntBits(f) == 0x80000000) {
System.out.println("Negative zero");
}
(Float.floatToIntBits(f) & 0x80000000) < 0
绝对不是最好的方法。检出功能
Float.floatToRawIntBits(f);
Doku:
/**
* 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);
Double.equals
在Java中区分±0.0。(也有Float.equals
。)
没有人提到这些,我感到有些惊讶,因为在我看来,它们比到目前为止提供的任何方法都清晰!
当float为负数(包括-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
}