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

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 на индекса на десетичната запетая.

Нека разберем това с пример:

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.