java - solamente - que pida un numero y diga si es positivo o negativo
¿Cómo verifico si un cero es positivo o negativo? (7)
¿Es posible verificar si un float
es un cero positivo (0.0) o un cero negativo (-0.0)?
Convertí el float
en un String
y verifiqué si el primer char
era ''-''
, pero ¿hay otras formas?
Cuando un float es negativo (incluidos -0.0
y -inf
), usa el mismo bit de signo que un int negativo. Esto significa que puede comparar la representación entera a 0
, eliminando la necesidad de conocer o calcular la representación entera de -0.0
:
if(f == 0.0) {
if(Float.floatToIntBits(f) < 0) {
//negative zero
} else {
//positive zero
}
}
Eso tiene una ramificación adicional sobre la respuesta aceptada, pero creo que es más legible sin una constante hexadecimal.
Si su objetivo es solo tratar a -0 como un número negativo, podría omitir la afirmación if
externa:
if(Float.floatToIntBits(f) < 0) {
//any negative float, including -0.0 and -inf
} else {
//any non-negative float, including +0.0, +inf, and NaN
}
Definitivamente no es el mejor enfoque. Verifica la función
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);
El enfoque utilizado por Math.min
es similar a lo que Jesper propone pero un poco más claro:
private static int negativeZeroFloatBits = Float.floatToRawIntBits(-0.0f);
float f = -0.0f;
boolean isNegativeZero = (Float.floatToRawIntBits(f) == negativeZeroFloatBits);
Para negativo:
new Double(-0.0).equals(new Double(value));
Por positivo:
new Double(0.0).equals(new Double(value));
Puede usar Float.floatToIntBits
para convertirlo a un int
y observar el patrón de bits:
float f = -0.0f;
if (Float.floatToIntBits(f) == 0x80000000) {
System.out.println("Negative zero");
}
Sí, divídelo 1 / +0.0f
es +Infinity
, pero 1 / -0.0f
es -Infinity
. Es fácil descubrir cuál es con una simple comparación, por lo que obtienes:
if (1 / x > 0)
// +0 here
else
// -0 here
(Esto supone que x
solo puede ser uno de los dos ceros)
Double.equals
distingue ± 0.0 en Java. (También hay Float.equals
).
Estoy un poco sorprendido de que nadie haya mencionado esto, ya que me parece más claro que cualquier otro método dado hasta ahora.