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.