what - Java: doble vs float
what is json (6)
De forma predeterminada, Java tratará un decimal (por ejemplo, " 4.3
") como un double
menos que especifique un float
agregando una f después del número (por ejemplo, " 4.3f
").
Estás teniendo el mismo problema en ambas líneas. Primero, el literal compilador interpreta el literal decimal. A continuación, intenta asignarlo a b
, que es de tipo float
. Dado que un double
es de 64 bits y un float
es de solo 32 bits (consulte la documentación de los primitivos de Java ), Java le da un error que indica que el float
no puede caber dentro del double
. La solución es agregar una f a tus literales decimales.
Si intentara hacer lo contrario (es decir, asigne un float
a un double
), estaría bien, ya que puede ajustar los 32 bits de un float
dentro de un double
de 64.
En otro ejercicio de Bruce Eckel, el código que he escrito toma un método y cambia de valor en otra clase. Aquí está mi código:
class Big {
float b;
}
public class PassObject {
static void f(Letter y) {
y.c = ''z'';
} //end f()
static void g(Big z) {
z.b = 2.2;
}
public static void main(String[] args ) {
Big t = new Big();
t.b = 5.6;
System.out.println("1: t.b : " + t.b);
g(x);
System.out.println("2: t.b: " + t.b);
} //end main
}//end class
Está lanzando un error que dice "Posible pérdida de precisión".
PassObject.java:13: possible loss of precision
found: double
required : float z.b = 2.2
passobject.java:20: possible loss of precision
found : double
required : float t.b = 5.6
¿No puede el double
ser float
también?
gracias por adelantado
No uses el flotador. Casi nunca hay una buena razón para usarlo y no lo ha sido durante más de una década. Sólo tiene que utilizar doble.
No, los flotadores se pueden convertir automáticamente a dobles, pero los dobles nunca pueden ser flotantes sin un lanzamiento explícito porque los dobles tienen un rango mayor.
el rango de flotación es 1.40129846432481707e-45
a 3.40282346638528860e+38
el rango doble es 4.94065645841246544e-324d
a 1.79769313486231570e+308d
Sí, pero tienes que especificar que son flotantes, de lo contrario se tratan como dobles:
z.b = 2.2f
La ''f'' al final del número lo convierte en un flotante en lugar de un doble.
Java no reducirá automáticamente un doble a un flotador.
el rango de flotación es más bajo que el doble, por lo que un flotador se puede representar fácilmente en doble, pero no es posible lo contrario porque, digamos que tomamos un valor que está fuera del rango de flotación, entonces durante la convención perderemos los datos exactos
can''t doubles be floats as well?
No. Cada valor o variable tiene exactamente un tipo (double, float, int, long, etc ...). La especificación del lenguaje Java establece exactamente lo que sucede cuando intenta asignar un valor de un tipo a una variable de otro tipo. En general, las asignaciones de un valor "más pequeño" a un tipo "más grande" están permitidas y se realizan de forma implícita, pero las asignaciones en las que la información podría perderse porque el tipo de destino es demasiado "pequeño" para contener todos los valores del tipo de origen no están permitidas por el compilador, incluso si el valor concreto se ajusta al tipo de destino.
Es por eso que el compilador se queja de que asignar un valor doble (que el literal es implícitamente) a una variable flotante podría perder información, y usted tiene que aplacarlo haciendo que el valor sea un valor flotante, o lanzando explícitamente.
Un área que a menudo causa confusiones son los cálculos, ya que estos se "amplían" implícitamente a int por razones técnicas. Entonces, si multiplicas dos cortos y tratas de asignar el resultado a un corto, el compilador se quejará porque el resultado del cálculo es un int.