Cómo separar el doble en partes enteras y decimales

1. Información general

En este tutorial, exploraremos varios métodos para separar partes enteras y decimales de tipos de punto flotante en Java, a saber, float y double .

2. Problemas con los tipos de puntos flotantes

Comencemos por mirar una fracción simple y una forma ingenua de realizar la separación, a través del casting:

double doubleNumber = 24.04; int intPart = (int) doubleNumber; System.out.println("Double Number: " + doubleNumber); System.out.println("Integer Part: " + intPart); System.out.println("Decimal Part: " + (doubleNumber - intPart));

Cuando intentamos ejecutar el código anterior, esto es lo que obtenemos:

Double Number: 24.04 Integer Part: 24 Decimal Part: 0.03999999999999915

Contrariamente a nuestras expectativas, la salida no imprime correctamente la parte decimal. Por lo tanto, los números de coma flotante no son adecuados para cálculos en los que no se pueden tolerar los errores de redondeo.

3. Primer enfoque: dividir la cuerda

En primer lugar, convierta el número decimal en un equivalente de cadena . Entonces podemos dividir la Cadena en el índice del punto decimal.

Entendamos esto con un ejemplo:

double doubleNumber = 24.04; String doubleAsString = String.valueOf(doubleNumber); int indexOfDecimal = doubleAsString.indexOf("."); System.out.println("Double Number: " + doubleNumber); System.out.println("Integer Part: " + doubleAsString.substring(0, indexOfDecimal)); System.out.println("Decimal Part: " + doubleAsString.substring(indexOfDecimal)); 

La salida del código anterior es:

Double Number: 24.04 Integer Part: 24 Decimal Part: .04

El resultado es exactamente lo que esperamos. Pero, el problema aquí es la limitación de usar una cadena, lo que significa que ahora no podremos realizar ninguna otra operación aritmética.

4. Segundo enfoque: uso de BigDecimal

La clase BigDecimal en Java proporciona a su usuario un control completo sobre el comportamiento de redondeo. Esta clase también proporciona operaciones para aritmética, manipulación de escalas, redondeo, comparación, hash y conversión de formato.

El uso de Let BigDecimal para obtener las partes enteras y decimales de un número de coma flotante:

double doubleNumber = 24.04; BigDecimal bigDecimal = new BigDecimal(String.valueOf(doubleNumber)); int intValue = bigDecimal.intValue(); System.out.println("Double Number: " + bigDecimal.toPlainString()); System.out.println("Integer Part: " + intValue); System.out.println("Decimal Part: " + bigDecimal.subtract( new BigDecimal(intValue)).toPlainString());

La salida será:

Double Number: 24.04 Integer Part: 24 Decimal Part: 0.04

Como podemos ver arriba, la salida es la esperada. También podemos realizar operaciones aritméticas con la ayuda de métodos proporcionados en la clase BigDecimal .

5. Conclusión

En este artículo, discutimos varios métodos para separar partes enteras y decimales de tipos de coma flotante. También discutimos los beneficios de usar BigDecimal para cálculos de punto flotante.

Además, nuestro tutorial detallado sobre BigDecimal y BigInteger en Java analiza más características y escenarios de uso de las dos clases.

Finalmente, el código fuente completo para este tutorial está disponible en GitHub.