Рубрики
Без рубрики

Как разделить Double на целочисленную и десятичную части

Взгляните на способы разделения целых и десятичных частей двойного числа в Java.

Автор оригинала: baeldung.

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. Первый подход: Разделение строки

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

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

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 обсуждаются дополнительные характеристики и сценарии использования этих двух классов.

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