Autor Tema: Java redondear a 2 decimales BigDecimal diferencia entre RoundingMode CU00907C  (Leído 3475 veces)

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Hola dejo el ejercicio Java  CU00907C del tutorial de programación Java desde cero. Redondear a 2 o más decimales. Errores precisión. BigDecimal, RoundingMode, BigInteger ().

Citar
EJERCICIO

Crea un programa para el cálculo del importe final a partir del importe inicial y un porcentaje de impuestos. El importe inicial y el porcentaje de impuestos deben solicitarse al usuario. El programa debe mostrar el resultado ateniéndose a estas reglas: debe mostrarse el impuesto como resultado de calcular el importe inicial por el porcentaje dividido entre 100, con precisión de dos decimales y redondeo al entero más próximo o en caso de equidistancia, redondeo al entero mayor. Debe mostrarse el importe final como resultado de sumar el importe inicial con el impuesto, por tanto tendrá precisión de dos decimales.
Ejemplo de resultados a obtener:
Por favor introduzca el importe inicial: 0.70
Por favor introduzca el porcentaje de impuestos: 5
El impuesto a pagar es: 0.04
El importe final es: 0.74


Codigo de la Clase CalcularImpuesto

Código: [Seleccionar]
import java.math.RoundingMode;
import java.util.Scanner;
import java.math.BigDecimal;
public class CalculoImpuesto
{
    public static Scanner entrada=new Scanner(System.in);
    public static String entradaUsuario="";
    public static double baseImponible=0.0;
    public static double porcentage=0.0;
    public static void main(String arg[ ]) {
         boolean fin=true;
         
        Scanner entrada=new Scanner(System.in);
        do{
        System.out.print("Por favor introduzca la base imponible: :");
        baseImponible=Double.parseDouble(validarNumero());
        System.out.print("Por favor introduzca el porcentage a aplicar: ");
        porcentage=Double.parseDouble(validarNumero());
        // Antes de aplicar el redondeo
        double imp=(baseImponible*porcentage)/100;
        double total=imp+baseImponible;
         System.out.print("\nAntes de redondeo\n\nBase imponible: "+baseImponible+
            "\nPorcentage a aplicar: "+porcentage+
            "\nTotal Impuesto: "+imp +
            "\nTotal a pagar: "+total );
       //Despues del redondeo
       BigDecimal impuesto=BigDecimal.valueOf((baseImponible*porcentage)/100);
       impuesto=impuesto.setScale(2,RoundingMode.UP);
       BigDecimal totalAPagar=BigDecimal.valueOf(((baseImponible*porcentage)/100)+baseImponible);
       totalAPagar=totalAPagar.setScale(2,RoundingMode.UP);
        System.out.print("\n\n\nDespues de redondeo\n\nBase imponible: "+baseImponible+
            "\nPorcentage a aplicar: "+porcentage+
            "\nTotal Impuesto: "+impuesto+
            "\nTotal a pagar: "+totalAPagar);
            entradaUsuario=entrada.nextLine();
            System.out.print('\u000C');
            fin=entradaUsuario.equals("");
        }while(fin);
    }//Fin del main


    //Bucle para validar que solo se escriban numeros por teclado
    public static String validarNumero(){
        int num=0;
        boolean ok=false;
        do{

            entradaUsuario= entrada.nextLine();
            //Comprobar que sea un numero entero
              if (isNumeric(entradaUsuario) == true) {
                    ok=true;
                }
                else{
                    System.out.print('\u000C');
                    System.out.print("Solo se admiten numeros\n");
                    entradaUsuario="";
                }

             

        } while (!ok);
        return entradaUsuario;
    }

    public static boolean isNumeric(String str) {//Validacion numeros
        return (str.matches("[+-]?\\d.*[0-9]?") && str.equals("")==false);
    }
}

Gracias un saludo ;)
« Última modificación: 16 de Agosto 2019, 20:39 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas, para quien revise este ejercicio, después de probar el programa, a mí al menos no me funciona correctamente.

Por un lado, no veo cómo salir del programa. Introduzco datos, pero no tengo forma de cerrar la consola (terminar el programa).

Por otro lado, el redondeo que realiza no veo que sea el correcto. Por ejemplo:

Citar
Por favor introduzca la base imponible: :0.70
Por favor introduzca el porcentage a aplicar: 3

Antes de redondeo

Base imponible: 0.7
Porcentage a aplicar: 3.0
Total Impuesto: 0.020999999999999998
Total a pagar: 0.721


Despues de redondeo

Base imponible: 0.7
Porcentage a aplicar: 3.0
Total Impuesto: 0.03
Total a pagar: 0.73

Sin embargo, el total a pagar con redondeo debe ser 0.72.

El problema posiblemente está relacionado con el uso de RoundingMode.UP en lugar de RoundingMode.HALF_UP

Puede verse una solución correcta a este ejercicio en https://aprenderaprogramar.com/foros/index.php?topic=5672.0

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".