Foros del Web » Programación para mayores de 30 ;) » Java »

¿int redondea por defecto?

Estas en el tema de ¿int redondea por defecto? en el foro de Java en Foros del Web. Hola! Es mi primer mensaje del foro así que aprovecho para presentarme. Soy novato total en programación (supongo que por el título del mensaje ya ...
  #1 (permalink)  
Antiguo 23/02/2012, 14:09
Avatar de Zaparl  
Fecha de Ingreso: febrero-2012
Mensajes: 3
Antigüedad: 12 años, 2 meses
Puntos: 1
Pregunta ¿int redondea por defecto?

Hola!

Es mi primer mensaje del foro así que aprovecho para presentarme. Soy novato total en programación (supongo que por el título del mensaje ya lo habréis notado) y acabo de descubriros. Sed pacientes conmigo si digo alguna obviedad, hehehe...

Bueno, al grano. Estoy estudiando java y se me propone un ejercicio para separar una cantidad de euros en el número mínimo de billetes correspondiente. El código creo que lo tengo bastante definido pero me he dado cuenta de que usando el tipo int no me coje muy bien la parte entera del número en cuestión. Si os parece copio el código y luego os comento.

Código:
package propuestos1;

public class Ejercicio12 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

//Variable euros con la cantidad a organizar y luego una variable por cada tipo de 
//billete.
		int euros=51167,quini,cien,cincuenta,veinte,diez,cinco,resto;
		
//Operaciones para separar la cantidad en billetes empezando por el billete mayor.  
//Se divide la cantidad total de euros entre el tipo de billete, se coge la parte entera y 
//luego se le restan los billetes correspondientes a los billetes de mayor cuantía que 
//él mismo.
		quini=euros/500;
		cien=(euros/100)-(quini*5);
		cincuenta=(euros/50)-(cien*2)-(quini*10);
		veinte=(euros/20)-((cincuenta*5)/2)-(cien*5)-(quini*25);
		diez=(euros/10)-(veinte*2)-(cincuenta*5)-(cien*10)-(quini*50);
		cinco=(euros/5)-(diez*2)-(veinte*4)-(cincuenta*10)-(cien*20)-(quini*100);
		resto=euros -(cinco*5)-(diez*10)-(veinte*20)-(cincuenta*50)-(cien*100)-(quini*500);
		
		System.out.println("El reparto de "+euros+" en billetes es el siguiente");
		System.out.println("\n");
		System.out.println(quini+" billetes de 500\n"+cien+" billetes de 100\n"+cincuenta+" billetes de 50\n");
		System.out.println(veinte+" billetes de 20\n"+diez+" billetes de 10\n"+cinco+" billetes de 5\nsobran "
		+resto+" euros");
	}

}
Como veis he hecho una variable tipo int para cada tipo de billete para que al hacer la división me salga solo la parte entera. Luego para cada tipo de billete hago lo mismo pero restando la cantidad de billetes de sus billetes superiores y así sucesivamente.

El tema es que me pasa una cosa curiosa con los billetes de 10 y de 20. Aparentemente el programa funciona pero si la cifra de euros contiene un 50 o superior (para todas las cantidades posibles) lo que hace el programa es añadir un billete extra de 20 y restar uno de 10 con lo cual el resultado de los billetes de 10 es -1. Esto mismo no pasa si la cifra contiene un 40, un 30 o cualquier número menor de 50. Es decir que en el último caso lo hace bien y en el primer caso en vez de añadir un billete de 10 lo que hace es meter uno de 20 y restarle uno de 10. Supongo que se verá más claro al ejecutar el código.

Supongo que podría hacer una cláusula condicional a tipo de parche para apañar este error pero me resulta poco elegante y me gustaría sobretodo saber por qué pasa eso y si se puede evitar. Supongo que se trata de algún tipo de redondeo por defecto pero claro, la verdad es que no tengo ni idea. A ver si alguien lo podría aclarar.

Gracias!
  #2 (permalink)  
Antiguo 23/02/2012, 15:07
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 16 años, 3 meses
Puntos: 57
Respuesta: ¿int redondea por defecto?

Si haces una division entre enteros, el resultado tambien es un entero. Pero si haces una division y alguna de las variables es double o float, el resultado ya no sera entero.

Pero creo que una solucion mas facil es hacer las divisiones como las estas haciendo pero en lugar de restar el valor de lo que ya has calculado, seria mejor guardar el "resto" en una variable e ir diviendo ese valor. El resto de la division se obtiene con el operador porcentaje (%)

Por ejemplo, con los datos que pusiste, para los billetes de 500, esta bien hacer euros/500. El "resto" de la division serian 167. Ese valor lo podrias guardar en la variable resto. Ahora, en la siguiente linea, para obtener los billetes de 100, en lugar de euros/100 - todo lo demas, usarias solamente resto/100, guardas el resto en la variable resto (que serian 67) y asi sucesivamente.

Ya hice la prueba y me sale el resultado correcto
  #3 (permalink)  
Antiguo 23/02/2012, 15:56
Avatar de Zaparl  
Fecha de Ingreso: febrero-2012
Mensajes: 3
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: ¿int redondea por defecto?

Hola posman.

He seguido tus indicaciones y va muy bien y sin ese desfase raro que me salía. Gracias!

De todos modos me gustaría saber qué le pasaba a ese int. Todas las variables eran int así que en teoría debería haber funcionado. ¿Quizá debería haberlo puesto todo en double y hacer un casting a int? Raro, raro...

Etiquetas: int, redondeo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:57.