Перейти к основному содержимому

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

· 3 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

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.