Як розділити подвійне на цілі та десяткові частини

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 еквівалент. Тоді ми можемо розділити рядок на десятковий індекс.

Давайте розберемося в цьому на прикладі:

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.