¿Cómo puede un valor flotante primitivo ser -0.0? Qué significa eso?

¿Cómo es que un valor flotante primitivo puede ser -0.0? Qué significa eso?
¿Puedo cancelar esa función?

Cuando tengo:

float fl; 

Entonces fl == -0.0 devuelve true y también fl == 0 . Pero cuando lo -0.0 , imprime -0.0 .

Porque Java usa el estándar IEEE para aritmética de coma flotante (IEEE 754) que define -0.0 y cuándo debería utilizarse.

El número más pequeño representable no tiene 1 bit en el significado subnormal y se llama cero positivo o negativo según lo determinado por el signo. En realidad representa un redondeo a cero de números en el rango entre cero y el número representativo distinto de cero del mismo signo , por lo que tiene un signo, y por qué su recíproco + Inf o -Inf también tiene un signo.

Puede solucionar su problema específico agregando 0.0

p.ej

 Double.toString(value + 0.0); 

Ver: intrincaciones de números flotantes de Java

Operaciones que implican cero negativo

(-0.0) + 0.0 -> 0.0

“-0.0” se produce cuando una operación de punto flotante da como resultado un número negativo de coma flotante tan cerca de 0 que no se puede representar normalmente.

¿Cómo es que un valor flotante primitivo puede ser -0.0?

los números de punto flotante se almacenan en la memoria utilizando el estándar IEEE 754, lo que significa que podría haber errores de redondeo. Nunca podría ser capaz de almacenar un número de punto flotante de precisión infinita con recursos finitos.

Nunca debe probar si un número de coma flotante == a otro, es decir, nunca escriba un código como este:

 if (a == b) 

donde a y b son flotadores. Debido a errores de redondeo, esos dos números podrían almacenarse como valores diferentes en la memoria.

Debe definir una precisión con la que desea trabajar:

 private final static double EPSILON = 0.00001; 

y luego prueba contra la precisión que necesitas

 if (Math.abs(a - b) < epsilon) 

Entonces, en su caso, si desea probar que un número de punto flotante es igual a cero en la precisión dada:

 if (Math.abs(a) < epsilon) 

Y si desea formatear los números al generarlos en la GUI, puede consultar el siguiente artículo y la clase NumberFormat .

El tipo de coma flotante en Java se describe en JLS: 4.2.3 Tipos, formatos y valores de coma flotante .

Habla sobre estos valores especiales:

(…) Cada uno de los cuatro conjuntos de valores incluye no solo los valores finitos distintos de cero que se le atribuyen anteriormente, sino también los valores NaN y los cuatro valores cero positivo, cero negativo , infinito positivo e infinito negativo. (…)

Y tiene algunas notas importantes sobre ellos:

El cero positivo y el cero negativo se comparan iguales; por lo tanto, el resultado de la expresión 0.0 == – 0.0 es verdadero y el resultado de 0.0> -0.0 es falso. Pero otras operaciones pueden distinguir cero positivo y negativo; por ejemplo, 1.0 / 0.0 tiene el valor infinito positivo, mientras que el valor de 1.0 / -0.0 es infinito negativo.

No se puede “cancelar” esa función, es parte de cómo funcionan las carrozas.

Para obtener más información sobre el cero negativo, eche un vistazo a la entrada Firmado cero de Wikipedia.

Si desea verificar qué “tipo” de cero tiene, puede usar el hecho de que:

 (new Float(0.0)).equals(new Float(-0.0)) 

es false (pero de hecho, 0.0 == -0.0 ).

Eche un vistazo aquí para obtener más información sobre esto: intrínsecas del número flotante de Java .

Desde wikipedia

El estándar IEEE 754 para aritmética de coma flotante (actualmente utilizado por la mayoría de las computadoras y lenguajes de progtwigción que admiten números en coma flotante) requiere tanto de +0 como de -0. Los ceros se pueden considerar como una variante de la recta numérica real extendida de modo que 1 / -0 = -∞ y 1 / + 0 = + ∞, la división por cero solo está indefinida para ± 0 / ± 0 y ± ∞ / ± ∞ .

No creo que puedas o necesites cancelar esa función. No debe comparar los números de punto flotante con == debido a errores de precisión de todos modos.

Un buen artículo sobre cómo se gestionan los números de coma flotante en java / computadoras. http://www.artima.com/underthehood/floating.html

Por cierto: es un verdadero dolor en las computadoras cuando 2.0 – 1.0 podría producir 0.999999999999 que no es igual a1.0 :). Eso puede ser especialmente fácil de encontrar en las validaciones de formularios de JavaScript.