Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Sugerencia] Quiero compartir mis observaciones

Cuando hice un retiro de $1500, el saldo que me dio fue de: $99.99000000000001 pesos. Le pregunté al GPT y me dijo:

¡Muy buena pregunta! Esto es uno de esos detalles curiosos (y frustrantes) de la programación que tienen que ver con cómo funcionan los números decimales en las computadoras.

¿Por qué pasa esto? En Java (y en casi todos los lenguajes), el tipo double usa una representación binaria aproximada del número decimal que escribes.

Esto significa que números como 1599.99 y 1500.00 no se pueden representar con precisión exacta en binario, así como 1/3 no se puede representar exactamente en decimal (es 0.333... infinito).

Entonces, cuando haces:

double saldo = 1599.99; System.out.println(saldo - 1500.00); Aunque tú ves 1599.99 - 1500.00 = 99.99, la computadora realmente está operando con una aproximación binaria, y el resultado acaba siendo algo como:

99.99000000000001

por lo que escogí una de sus sugerencias para mostrar sólo 2 decimales y que también me sirviera para el otro detalle que noté: si retiro los centavos, al quedar la cantidad sin decimales, me daba sólo $99.0 , en lugar de $99.00.

Ésta fue la solución:

Se declara formato: DecimalFormat formato = new DecimalFormat("#.00");

y el IDE te pregunta para importar la clase: import java.text.DecimalFormat;

Al imprimir, le pasas el formato a saldo : System.out.println("Tu saldo actual es de: $" + (formato.format(saldo)) + "pesos");

Y con eso se corrigen los dos problemas

Me pareció interesante saber ésto. Espero que les sirva también

Aquí está en el código

import java.text.DecimalFormat;
import java.util.Scanner;

public class CajeroAutomatico {
    public static void main(String[] args) {

        double saldo = 1599.99;
        int respuesta = 0;
        String tipoDeCuenta = "Corriente";
        String nombreDelCliente = "Tony Stark";

        System.out.println("°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°");
        System.out.println("BANCO MARVEL INTERNACIONAL");
        System.out.println("Bienvenido " + nombreDelCliente);
        System.out.println("Tu tipo de cuenta es: " + tipoDeCuenta);
        System.out.println("Tu saldo es de $" + saldo + " pesitos");
        System.out.println("°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°\n");

        Scanner usuario = new Scanner(System.in);

        //Para imprimir 2 decimales usando (formato.format(saldo)) al momento de imprimir
        DecimalFormat formato = new DecimalFormat("#.00");

        while (respuesta != 9) {
            System.out.println("¿Qué quieres hacer? Selecciona la opción deseada:");
            System.out.println("1: Consultar tu saldo");
            System.out.println("2: Retirar");
            System.out.println("3: Depositar");
            System.out.println("9: Salir");
            respuesta = usuario.nextInt();

            switch (respuesta){

                case 1:
                    System.out.println("\nTu saldo actual es de: $" + (formato.format(saldo)) + "pesos\n");
                    break;

                case 2:
                    System.out.println("\n¿Cuánto deseas retirar?");
                    double retiro = usuario.nextDouble();
                    if (retiro > saldo){
                        System.out.println("\n¡Calmad@! sólo tienes $" + (formato.format(saldo)) + " pesos en tu cuenta\n");
                    } else {
                        saldo = saldo - retiro;
                        System.out.println("\nToma tu efectivo");
                        System.out.println("Tu saldo actual es: $" + (formato.format(saldo)) + " pesos\n");
                    }
                    break;

                case 3:
                    System.out.println();
                    System.out.println("¿Cuánto deseas depositar?");
                    double deposito = usuario.nextDouble();
                    saldo = saldo + deposito;
                    saldo = Math.round(saldo * 100.0) / 100.0;
                    System.out.println("\nTu saldo ahora es de: $" + (formato.format(saldo)) + " pesos\n");
                    break;

                case 9:
                    System.out.println("\nNO OLVIDES TU TARJETA");
                    System.out.println("Gracias por utilizar tu Banco Marvel Internacional.");
                    System.out.println("Te esperamos pronto " + nombreDelCliente);
                    break;

                default:
                    System.out.println("\nSelecciona una opción válida\n");
            }
        }
    }
}
1 respuesta

¡Hola! ¿Cómo estás?

Gracias por tu aporte en el foro. Su contribución es esencial para el crecimiento de nuestra comunidad en Alura.

Sigue así y no dudes en volver al foro si tienes alguna pregunta o dificultad.

Abrazos y buenos estudios!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios!