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
Результат именно то, что мы ожидаем. Но проблема здесь в ограничении использования String, а это значит, что теперь мы не сможем выполнять с ним какие-либо другие арифметические операции.
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.