Te doy la bienvenida a nuestra comunidad, aquí hallarás la solucíon a lo que estás buscando.
Solución:
Los literales de punto flotante en Java son un double
valor por defecto.
JLS 3.10.2 Literales de coma flotante
Un literal de coma flotante es de tipo
float
si tiene el sufijo de una letra ASCIIF
of
; de lo contrario su tipo esdouble
y opcionalmente se le puede añadir como sufijo una letra ASCIID
od
.
No puedes asignar un double
valor a un float
sin una conversión de restricción explícita. Por tanto, tiene dos opciones:
- Para literales, use el sufijo
f
oF
para denotar unfloat
valor - Para los no literales, use una conversión explícita
(float)
Un ejemplo de esto último es:
double d = 1.1;
float f = (float) d; // compiles fine!
Sobre la ampliación de las conversiones
La razón por la que esto se compila:
float f = 1;
se debe a que la conversión de ampliación de int
a float
se puede hacer implícitamente en el contexto de una asignación.
Conversión de asignación JLS 5.2
Conversión de asignación ocurre cuando el valor de una expresión se asigna a una variable: el tipo de la expresión debe convertirse al tipo de la variable. Los contextos de asignación permiten el uso de uno de los siguientes:
- una conversión primitiva de ampliación (§5.1.2)
- […]
Conversión primitiva de ampliación de JLS 5.1.2
Las siguientes 19 conversiones específicas en tipos primitivos se denominan Ampliación de conversiones primitivas:
int
along
,float
, odouble
- […]
Otro sufijo de tipo de datos para literales
Como se mencionó anteriormente, también existe el D
o d
sufijo para double
. Considere este fragmento, por ejemplo:
static void f(int i)
System.out.println("(int)");
static void f(double d)
System.out.println("(double)");
//...
f(1); // prints "(int)"
f(1D); // prints "(double)"
También hay un sufijo para long
literales, que es L
o l
(letra minúscula). Está muy recomendable que usa la variante en mayúsculas.
JLS 3.10.1 Literales enteros
Un literal entero es de tipo
long
si tiene el sufijo de una letra ASCIIL
ol
(ell
); de lo contrario es de tipoint
. El sufijoL
se prefiere, porque la letral
(ell
) a menudo es difícil de distinguir del dígito1
(one
).
Estás asignando un double
valor a un float
variable. 1.1
por sí mismo (sin el f
tachonado al final) es asumido por el compilador como de tipo double
. Al compilador no le gusta hacer abatimientos implícitos porque existe la posibilidad de perder precisión.
Si estás contento con lo expuesto, tienes el poder dejar una reseña acerca de qué le añadirías a este post.