Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: jupertivo en 20 de Marzo 2015, 19:14
-
Hola amigos. Lo primero enhorabuena por el curso de Java desde cero. Poco a poco voy avanzando sin demasiadas penuras, y en parte, por cómo habéis redactado y explicado el curso.
Pero ahora he llegado a una duda para la que no obtengo respuesta. He buscado por los foros y en San Google, pero no obtengo la respuesta "precisa".
Entrega CU00652B, primer ejemplo. Lo transcribo a BlueJ, compilo, OK. Creo un objeto New Deposito, donde me pide los valores del diámetro, altura y el Id. Introduzco, p.e., d=3.256, h=4.954 e id="001".
En esa misma ventana me contesta en la parte de abajo: "Error: incompatible types: possible lossy conversion from double to float".
No lo entiendo. En el código, las variables están definidas como "float", y los valores introducidos no son tan "grandes" como para que los considere "double".
Si cambio en el programa las variables a tipo "double", no da error. Si introduzco valores enteros (ej.: 2 y 3), no da error. ¿Qué está pasando?
Gracias por vuestra atención.
-
Hola jupertivo, el problema pienso que está un poco en las definiciones internas de java y el enfoque que le da java al tratamiento numérico, no en que los valores que introduces sean grandes. Cuando se introduce un valor numérico en java como 3.256 java por defecto lo considera double. ¿Por qué? Porque para java double es el tipo numérico decimal por defecto, no tiene en consideración si es grande o si es pequeño, simplemente toma el tipo numérico universal decimal de java, el double. Si en el método sobre el que se aplica se requiere un float, avisa de que puede haber una pérdida de precisión desde el más preciso (double) al menos preciso (float). Para indicarle a java que el valor numérico introducido queremos que se trate como un float tendríamos que introducir 3.256f
Cuando introduces valores enteros java hace una conversión automática de tipos y transforma por ejemplo un 3 en 3.0f si tiene que pasarlo a float ó 3.0 si tiene que pasarlo a double.
Todo esto son detalles propios de java que en otros lenguajes puede ser de otra manera. Una forma de evitar problemas con esto es trabajar siempre con double. Saludos :D
-
Hola javi in the sky. Gracias por tu atención y por la respuesta. A esa conclusión he llegado también. Era por entender más "racionalmente" el porqué de si el código ya define una variable local, parámetro o campo de una clase como 'float', Java hace eso. En el código de la lección CU00652B pone:
//Constructor de la clase que pide los parámetros necesarios
public Deposito (float valor_diametro, float valor_altura, String valor_idDeposito) {
if (valor_diametro > 0 && valor_altura > 0) {
diametro = valor_diametro;
altura = valor_altura;
idDeposito = valor_idDeposito;
} else {
diametro = 10;
altura = 5;
idDeposito = "000";
} } //Cierre del constructor
Los valores son introducidos a petición del constructor, no son fijos. Por lo que no puedo ponerles p.e. 23.12f (o así lo veo yo).
Declarando las variables, etc. como float, sin problema. Era por lo de ahorrar memoria al escribir código eficiente según las directrices dadas en las lecciones.
Gracias de nuevo. :)