Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/02/2012, 14:09
Avatar de Zaparl
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!