es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El código Java dado tiene como objetivo contar el número total de dígitos presentes antes y después del punto decimal en un número de punto flotante ingresado por el usuario. Sin embargo, entra en un bucle infinito para los valores 58.2354 o 58.234.

    Parece que el problema está relacionado con la precisión del tipo de dato double utilizado para almacenar el número de entrada. Debido a la forma en que los números de punto flotante se representan en la memoria de la computadora, algunos valores decimales no se pueden almacenar exactamente con una precisión finita. Como resultado, cuando dicho número se multiplica por 10 en el segundo bucle do-while, es posible que no produzca un valor entero exactamente, lo que hace que el bucle continúe indefinidamente.

    Una posible solución a este problema es utilizar un tipo de dato más preciso, como BigDecimal, para almacenar el número de entrada y realizar operaciones aritméticas. Otra solución es establecer un nivel de tolerancia adecuado para la condición del bucle, de modo que este termine cuando la diferencia entre el valor actual de n y su parte entera sea menor que un umbral determinado.

    Por ejemplo, el código modificado con nivel de tolerancia podría verse así:

    import java.util.Scanner;
    
    class FloatDigit {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            double n = sc.nextDouble();
            int x = (int) n;
            int count = 0;
            do {
                count++;
                x = x / 10;
            } while (x != 0);
    
            System.out.println("Antes del punto decimal: " + count);
            count = 0;
            double frac = Math.abs(n - Math.floor(n));
            while (frac > 1e-15 && count < 15) {
                count++;
                frac = frac * 10 - (int) (frac * 10);
            }
            System.out.println(count + " dígitos presentes después del punto decimal.");
        }
    }
    

    En esta versión, el bucle para contar los dígitos después del punto decimal utiliza un nivel de tolerancia de 1e-15, lo que significa que terminará cuando la diferencia entre el valor actual de frac y su parte entera sea menor que 10^-15. Esto debería ser lo suficientemente pequeño para manejar la mayoría de los casos prácticos, al tiempo que evita el riesgo de un bucle infinito.

Comments are closed.