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.

Convirtiendo una cadena a un entero y luego a un doble – ¿cómo recuperar hasta cuatro posiciones detrás de la posición decimal de manera correcta?

Actualmente estoy trabajando en una calculadora simple del índice de masa corporal (IMC) en Java, en una aplicación más grande en Java / Spring Boot con Pruebas de Mojito. Mi función utiliza la altura y el peso como valores de entrada para calcular el IMC. A través de las operaciones aritméticas, los valores de entrada recibidos -cadenas de texto, convertidas en enteros- dan como resultado un número que representa el IMC; sin embargo, el IMC tiene más de cuatro posiciones detrás de la coma decimal; por lo tanto, decidí convertir el resultado de la operación aritmética de altura y peso en un valor de tipo Double.

Por alguna razón que no entiendo, convertir los valores de entrada de altura y peso -cadenas de texto- en valores Double produce errores en las pruebas de Mojito en lugares completamente diferentes -no relacionados con la función y la prueba real-, ya que los valores analizados ahora se utilizan como valores Double en otros lugares y, por lo tanto, producen pruebas fallidas; por lo tanto, decidí convertir los valores de entrada de altura y peso de String a Integer. El problema ahora es que esto resulta en un IMC que es un número con solo una posición decimal -por ejemplo, 0.0-, mientras que antes tenía el valor Double como 0.0034 o 0.0040, que son valores de IMC correctos con solo cuatro dígitos detrás de la coma decimal.

En resumen: no puedo convertir String en Double ya que esto provocará pruebas fallidas por alguna razón que no entiendo en otros lugares de la aplicación.

La conversión del resultado del cálculo del IMC da como resultado un valor Integer con las posiciones faltantes detrás de la coma decimal para que la función funcione.

Dado que estoy atascado aquí, agradecería cualquier sugerencia o ayuda, ¡gracias de antemano!

Esta es mi función:

public boolean calculateBMI() {
int totalWeight = Integer.parseInt(gewicht);
int totalHeight = Integer.parseInt(koerpergroesse);
// calcula el IMC
float bmi = totalWeight / (totalHeight * totalHeight);

si (bmi > 0.0030 && bmi <= 0.0040) {
  retorna verdadero;
}
retorna falso;

}
}

Cuando ingreso 183 como altura y 120 como peso, recibo un valor de IMC de 0.0; como valor Double, sería algo como 0.0034 y la función devolvería el valor booleano correcto.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución de problemas de una función de calculadora de IMC en Java

    Soy un experto en IT especializado en Java, String, Spring Boot, Integer y Decimal. Recientemente, estuve trabajando en una sencilla función de calculadora de IMC (Índice de Masa Corporal) en Java como parte de una aplicación más grande de Java/Spring Boot. La función toma la altura y el peso como valores de entrada y calcula el IMC. Sin embargo, al convertir los valores de entrada de String a Double, los Mojito tests fallan en partes no relacionadas de la aplicación. Como solución temporal, decidí convertir los valores de entrada a Integer, lo que resulta en un valor de IMC con solo una posición decimal. Sin embargo, este valor no es útil para la función. Necesito ayuda para solucionar el problema.

    El problema

    El resultado del IMC en la función tiene más de cuatro posiciones después del decimal, es por eso que decidí convertir el resultado en un valor double. Sin embargo, al convertir los valores de entrada de String a Double, los Mojito tests fallan en partes no relacionadas de la aplicación. Convertir los valores de entrada a Integer resulta en un valor de IMC con solo una posición decimal, lo que no es útil para la función.

    La solución

    Una posible solución es usar BigDecimal en lugar de Double para manejar cálculos decimales con mayor precisión. BigDecimal es una clase que proporciona aritmética decimal de precisión arbitraria. Ayuda a evitar errores de redondeo y proporciona un mayor control sobre el redondeo de los resultados del cálculo. Puedes reemplazar el cálculo en la función con el siguiente código:

    BigDecimal totalWeight = new BigDecimal(gewicht);
    BigDecimal totalHeight = new BigDecimal(koerpergroesse);
    // calculate bmi
    BigDecimal bmi = totalWeight.divide(totalHeight.pow(2), 4, RoundingMode.HALF_UP);
    
    if (bmi.compareTo(new BigDecimal("0.0030")) > 0 && bmi.compareTo(new BigDecimal("0.0040")) <= 0) {
      return true;
    }
    return false;
    

    Este código crea dos objetos BigDecimal para la altura y el peso, respectivamente. Luego calcula el IMC dividiendo el peso por la altura al cuadrado con una precisión de cuatro y redondeando al número más cercano utilizando el enumerado RoundingMode.HALF_UP. Finalmente, compara el valor del IMC con el rango deseado de 0.0030 a 0.0040 usando el método compareTo().

    Otra solución es investigar por qué convertir los valores de entrada a Double causa que los Mojito tests fallen en partes no relacionadas de la aplicación. Puedes utilizar técnicas de depuración para identificar la causa raíz del problema estableciendo puntos de interrupción, evaluando variables y avanzando a través del código.

    Conclusión

    Para manejar cálculos decimales con precisión en una función de calculadora de IMC en Java, puedes usar la clase BigDecimal en lugar de Double. BigDecimal proporciona una aritmética decimal precisa y un control sobre el redondeo. También puedes investigar por qué convertir los valores de entrada a Double causa que los Mojito tests fallen en partes no relacionadas de la aplicación utilizando técnicas de depuración.

Comments are closed.