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.

¿Por qué el método stripTrailingZeros de Java BigDecimal lleva a la notación científica?

Cuando se utiliza stripTrailingZeros para un número que termina en cero como 10, 50, etc., el método BigDecimal.toString() decide utilizar notación científica (en lugar de imprimir 50, imprime 5E+1). Aquí hay un ejemplo de código probado con Java 17:

public static void main(String[] asd)
{
    // imprime: "with stripTrailingZeros: 5E+1"
    System.out.println("with stripTrailingZeros: " + new BigDecimal("50").stripTrailingZeros());

    // imprime: "without stripTrailingZeros: 50"
    System.out.println("without stripTrailingZeros: " + new BigDecimal("50").toString());
}

Sé que ambos son correctos, pero me pregunto ¿por qué no devuelven ambos "50"?

Esta inconsistencia es molesta porque se propaga por toda la aplicación y en mi caso conduce a inconsistencias en mi API JSON, que es la cara del cliente (leída por humanos).

Sé que puedo solucionarlo utilizando BigDecimal.toPlainString(), pero parece incorrecto obligar al serializador (en mi caso Jackson) a utilizar este método con configuración adicional solo para este caso.
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Java, native, BigDecimal, strip y trailing, puede encontrarse con un problema de inconsistencia al utilizar el método stripTrailingZeros para números que terminan en cero, como 10, 50, y similares. Cuando se utiliza este método, el método BigDecimal.toString() decide utilizar la notación científica en lugar de imprimir el número tal como es. Por ejemplo, 50 se imprime como 5E+1. Tanto la notación científica como el número en sí son correctos, pero es frustrante tener inconsistencias en su API JSON, que es visible por los clientes y leída por seres humanos.

    Para solucionar este problema, puede utilizar BigDecimal.toPlainString(). Este método asegura que el número se imprima tal como es, sin notación científica ni ceros adicionales. Sin embargo, el uso de este método puede requerir configuración adicional en su serializador (como Jackson), lo que puede parecer incorrecto. Vale la pena señalar que este problema solo ocurre al utilizar stripTrailingZeros, por lo que se puede utilizar BigDecimal.setScale (0, RoundingMode.DOWN) en su lugar para evitar el problema por completo.

Comments are closed.