java - metodos - La sobrecarga de método muestra ''error de tipo incompatible'' con float pero no con double
sobrecarga de metodos en java netbeans (5)
Intenté este método sobrecargando el código y obtuve el error
no se encontró un método adecuado para agregar (doble, doble)
El código:
class Adder {
static float add(float a, float b) {
return a + b;
}
static int add(int a, int b) {
return a + b;
}
}
class TestOverloading1 {
public static void main(String[] args){
System.out.println(Adder.add(11.5, 11.5));
System.out.println(Adder.add(27, 21));
}
}
Al escribir, 11.5f en params, esto funciona bien.
Entendí las diferencias entre float y double desde aquí y aquí .
Entonces, ¿por qué Java toma los parámetros como tipo de datos doble por defecto? ¿Hay una mayor precisión de doble detrás de tal sesgo?
Soy consciente de que toma el doble por defecto. Pero, deseo saber cuál es la razón detrás de esto?
"11.5" sin nada es considerado como el doble por Java. Puedes usar algo como:
System.out.println(Adder.add(new Float(11.5),new Float(11.5)));
En Java cuando escribimos el número decimal como 11.5, entonces se considera como el doble. double es de 64 bits mientras que float es de 32 bits por lo que la conversión no es posible, por eso ocurre la excepción de tiempo de compilación. Para obtener más información, visite: Tipos de datos primitivos
Es solo una especificación. Al igual que por qué int
tiene el valor predeterminado 0 en Java.
El doble es el tipo predeterminado para valores decimales:
double: el tipo de datos dobles es un punto flotante IEEE 754 de 64 bits de doble precisión. Su rango de valores está más allá del alcance de esta discusión, pero se especifica en la sección Tipos, formatos y valores de punto flotante de la Especificación del lenguaje Java. Para valores decimales, este tipo de datos generalmente es la opción predeterminada . Como se mencionó anteriormente, este tipo de datos nunca debe usarse para valores precisos, como la moneda.
Fuente: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
Un literal de coma flotante sin ningún sufijo (como 11.5
) es de tipo double
por definición (de manera similar, un literal entero sin ningún sufijo es de tipo int
).
Un parámetro double
no es aceptable para un método que acepta argumentos float
(ya que una conversión de double
a float
puede provocar la pérdida de datos, y por lo tanto el compilador no realizará dicha conversión de forma automática).
Por otro lado, 11.5f
es un literal float
, por lo que puede pasar tales literales a su método de add(float a,float b)
.
obra
Adder.add(11.5,11.5)
es lo mismo que
double a = 11.5;
double b = 11.5;
Adder.add(a, b)
eso no coincide con los parámetros en el método estático
static float add(float a,float b){return a+b;}
por lo tanto, se le requiere: lanzar esos literales para flotar:
Adder.add(11.5f, 11.5f );
o declarar ayb como flotador
float a = 11.5;
float b = 11.5;
Adder.add(a, b)