Come separare il doppio in parti intere e decimali

1. Panoramica

In questo tutorial, esploreremo vari metodi per separare parti intere e decimali di tipi a virgola mobile in Java, vale a dire float e double .

2. Problemi con i tipi a virgola mobile

Cominciamo osservando una semplice frazione e un modo ingenuo di eseguire la separazione, tramite casting:

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));

Quando proviamo a eseguire il codice sopra, ecco cosa otteniamo:

Double Number: 24.04 Integer Part: 24 Decimal Part: 0.03999999999999915

Contrariamente alle nostre aspettative, l'output non stampa correttamente la parte decimale. Pertanto, i numeri in virgola mobile non sono adatti per i calcoli in cui gli errori di arrotondamento non possono essere tollerati.

3. Primo approccio: dividere la corda

Prima di tutto, convertiamo il numero decimale in un equivalente String . Quindi possiamo dividere la stringa in corrispondenza dell'indice del punto decimale.

Capiamolo con un esempio:

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)); 

L'output del codice sopra è:

Double Number: 24.04 Integer Part: 24 Decimal Part: .04

L'output è esattamente quello che ci aspettiamo. Ma il problema qui è la limitazione dell'uso di una stringa, il che significa che non saremo in grado di eseguire altre operazioni aritmetiche su di essa.

4. Secondo approccio: utilizzo di BigDecimal

La classe BigDecimal in Java fornisce all'utente il controllo completo sul comportamento dell'arrotondamento. Questa classe fornisce anche operazioni per aritmetica, manipolazione della scala, arrotondamento, confronto, hash e conversione di formato.

Usiamo BigDecimal per ottenere le parti intero e decimale di un numero in virgola mobile:

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());

L'output sarà:

Double Number: 24.04 Integer Part: 24 Decimal Part: 0.04

Come possiamo vedere sopra, l'output è come previsto. Possiamo anche eseguire operazioni aritmetiche con l'aiuto dei metodi forniti nella classe BigDecimal .

5. conclusione

In questo articolo, abbiamo discusso vari metodi per separare parti intere e decimali di tipi a virgola mobile. Abbiamo anche discusso i vantaggi dell'utilizzo di BigDecimal per i calcoli in virgola mobile.

Inoltre, il nostro tutorial dettagliato su BigDecimal e BigInteger in Java discute più caratteristiche e scenari di utilizzo delle due classi.

Infine, il codice sorgente completo per questo tutorial è disponibile su GitHub.