Как разделить двойные на целые и десятичные части

1. Обзор

В этом руководстве мы рассмотрим различные методы для разделения целочисленных и десятичных частей типов с плавающей точкой в ​​Java, а именно float и double .

2. Проблемы с типами с плавающей точкой

Давайте начнем с рассмотрения простой дроби и наивного способа выполнения разделения посредством литья:

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));

Когда мы пытаемся запустить приведенный выше код, вот что мы получаем:

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

Вопреки нашим ожиданиям, вывод не печатает десятичную часть правильно. Следовательно, числа с плавающей точкой не подходят для вычислений, где ошибки округления не могут быть допущены.

3. Первый подход: расщепление String

Прежде всего, давайте преобразуем десятичное число в эквивалент String .

Затем мы можем разделить String по десятичному знаку.

Давайте разберемся с этим на примере:

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));

Вывод кода выше:

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

На выходе получается именно то, что мы ожидаем. Но проблема здесь заключается в ограничении использования строки - это означает, что мы не сможем теперь выполнять любые другие арифметические операции.

4. Второй подход: использование BigDecimal

Класс BigDecimal в Java предоставляет пользователю полный контроль над поведением округления.

Этот класс также предоставляет операции для арифметики, манипуляции с масштабом, округления, сравнения, хеширования и преобразования формата.

Давайте использовать BigDecimal , чтобы получить целые и десятичные части числа с плавающей запятой:

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());

Выход будет:

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

Как мы видим выше, результат такой же, как и ожидалось. Мы также можем выполнять арифметические операции с помощью методов, предоставляемых в классе BigDecimal .

5. Вывод

В этой статье мы обсудили различные методы разделения целочисленных и десятичных частей типов с плавающей точкой. Мы также обсудили преимущества использования BigDecimal для вычислений с плавающей запятой.

Кроме того, в нашем подробном руководстве по адресу BigDecimal и BigInteger в Java обсуждаются дополнительные характеристики и сценарии использования этих двух классов.

Наконец, полный исходный код для этого урока available на GitHub.