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.