Guadagna centesimi con BigDecimal

Per poter scrivere programmi Java che si occupano di finanze, è necessario conoscere il file

BigDecimal

classe e formattazione numerica. Il primo passo per insegnarti entrambi questi argomenti è prima creare

BigDecimal

oggetti. Useremo il file

BigDecimal

classe in

java.math

libreria per contenere valori. Puoi creare un file

BigDecimal

opporsi nel modo seguente:

Importo BigDecimal = nuovo BigDecimal ("1115,37"); 

Nel caso precedente, l' Stringargomento del BigDecimalcostruttore determina il valore dell'oggetto creato. Il valore di "1115.37"potrebbe rappresentare, ad esempio, il pagamento di un mutuo mensile in dollari o il saldo del libretto degli assegni. Per visualizzare l'importo, puoi utilizzare il metodo BigDecimaldella classe toString():

 System.out.println (amount.toString ()); 

Di BigDecimalseguito viene mostrato un programma che crea e visualizza un importo:

import java.math. *; ipoteca di classe pubblica {public static void main (String [] args) {BigDecimal payment = new BigDecimal ("1115.37"); System.out.println (payment.toString ()); }}

L'output del programma precedente è:

1115.37 

Formattazione della valuta

Dato che abbiamo a che fare con denaro, sarebbe bello che gli importi trattenuti dagli BigDecimaloggetti fossero formattati correttamente, che per la valuta statunitense includerebbero un segno di dollaro e una virgola come separatore delle migliaia. (Per altre valute, vedere la sezione Valuta di altri paesi di seguito). La NumberFormatclasse, che si trova nella java.textlibreria, può creare un oggetto appropriato per la valuta statunitense con il seguente codice:

 NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); 

Notare che la Localeclasse, usata come argomento per il getCurrencyInstance()metodo sopra, si trova nella java.utillibreria.

Il NumberFormat's format()metodo, che useremo prossimo, prende un doppio o lungo primitivo come argomento, quindi prima si trasformare l' BigDecimaloggetto in una doubleutilizzando BigDecimal' s doubleValue()metodo:

double doublePayment = payment.doubleValue (); 

Ora usiamo NumberFormatil format()metodo di per creare un String:

 Stringa s = n.format (doublePayment); 

Mettendo questi passaggi in un programma, abbiamo quindi:

import java.math. *; import java.text. *; import java.util. *; public class Mortgage2 {public static void main (String [] args) {BigDecimal payment = new BigDecimal ("1115.37"); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); double doublePayment = payment.doubleValue (); Stringa s = n.format (doublePayment); System.out.println (s); }}

L'output del programma precedente è:

, 115,37 

I lettori dovrebbero notare che la creazione di un doublevalore comporta una piccola perdita nella precisione del valore. Sebbene le imprecisioni siano troppo piccole per essere viste negli esempi di questo articolo, sono visibili in quantità molto grandi. Pertanto, non è possibile fare affidamento NumericFormatper produrre risultati accurati con numeri molto grandi (circa 13 o più cifre).

Valute di altri paesi

Nell'esempio precedente, abbiamo utilizzato Locale.UScome argomento passato al getCurrencyInstance()metodo per specificare la valuta del paese (Stati Uniti) con cui avremmo lavorato. Tuttavia, Java non si limita a lavorare con la valuta statunitense. Ad esempio, potresti utilizzare Locale.GERMANY, Locale.FRANCEo Locale.ITALYper specificare rispettivamente le valute di Germania, Francia e Italia. Il tema dell'internazionalizzazione è un argomento a sé stante; vedere la sezione Risorse per un collegamento a ulteriori informazioni.

Operazioni BigDecimal

BigDecimali metodi per aggiungere e sottrarre numeri sono add()e subtract(), rispettivamente. Ad esempio, per aggiungere 1.115,37 e 115,37, potremmo fare quanto segue:

Bilanciamento BigDecimal = nuovo BigDecimal ("1115,37"); Transazione BigDecimal = nuovo BigDecimal ("115,37"); BigDecimal newBalance = balance.add (transazione);

L BigDecimal' newBalanceoggetto ora contiene il valore di 1.230,74. Allo stesso modo, per sottrarre 115,37 da 1,115,37, potremmo usare questo codice:

Bilanciamento BigDecimal = nuovo BigDecimal ("1115,37"); Transazione BigDecimal = nuovo BigDecimal ("115,37"); BigDecimal newBalance2 = balance.subtract (transazione);

L BigDecimal' newBalance2oggetto ora contiene il valore di 1.000,00. (Naturalmente, se parliamo di saldi del libretto degli assegni nella vita reale, il subtract()metodo verrà utilizzato molto più spesso del add()metodo e l'importo totale sottratto dal saldo del libretto degli assegni supererà l'importo totale aggiunto, o almeno così sembra spesso.) può realizzare moltiplicando e dividendo con BigDecimal's multiply()e divide()metodi. La moltiplicazione è dimostrata nel seguente programma:

import java.math. *; import java.text. *; import java.util. *; public class Multiply {public static void main (String [] args) {BigDecimal d = new BigDecimal ("1115.32"); BigDecimal taxRate = nuovo BigDecimal ("0,0049"); BigDecimal d2 = d.multiply (taxRate); System.out.println ("Unformatted:" + d2.toString ()); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); double money = d2.doubleValue (); Stringa s = n.format (denaro); System.out.println ("Formatted:" + s); }}

L'output per il codice sopra è mostrato di seguito:

Non formattato: 5.465068 Formattato: .46 

Notare le posizioni decimali aggiuntive BigDecimalnell'oggetto non formattato rispetto all'output formattato. Inoltre, la formattazione del valore BigDecimaldell'oggetto provoca l'eliminazione della frazione, maggiore della metà. Per gestire le cifre decimali extra e la mancanza di arrotondamenti, possiamo usare BigDecimalil setScale()metodo di per impostare il numero di cifre decimali. Quando si utilizza setScale(), è necessario specificare non solo il numero di cifre decimali, ma come verrà arrotondato il numero, se è necessario l'arrotondamento. Il modo più comune di arrotondare - arrotondare per eccesso le frazioni di metà o più e tutte le altre frazioni per difetto - può essere specificato con BigDecimalla costante di ROUND_HALF_UP. Pertanto, per impostare il numero di cifre decimali a due e specificare che le frazioni metà e maggiori saranno arrotondate per eccesso, possiamo scrivere:

d2 = d2.setScale (2, BigDecimal.ROUND_HALF_UP); 

Modificando il programma sopra per aggiungere setScale(), ora abbiamo:

import java.math. *; import java.text. *; import java.util. *; public class Multiply2 {public static void main (String [] args) {BigDecimal d = new BigDecimal ("1115.32"); BigDecimal taxRate = nuovo BigDecimal ("0,0049"); BigDecimal d2 = d.multiply (taxRate); d2 = d2.setScale (2, BigDecimal.ROUND_HALF_UP); System.out.println ("Unformatted:" + d2.toString ()); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); double money = d2.doubleValue (); Stringa s = n.format (denaro); System.out.println ("Formatted:" + s); }}

Ora l'output è:

Non formattato: 5.47 Formattato: .47 

Ora il BigDecimalvalore viene arrotondato a due cifre, arrotondando il valore per eccesso e il formato formattato Stringvisualizza correttamente il valore arrotondato. Altre costanti utili nell'arrotondamento sono ROUND_HALF_DOWNe ROUND_HALF_EVEN. Il primo ROUND_HALF_DOWN,, arrotonda le frazioni di metà e sotto per difetto e tutte le altre per eccesso. Il secondo ROUND_HALF_EVEN,, arrotonda la metà delle frazioni al numero pari (ad esempio, 2,5 giri a 2, mentre 3,5 arrotonda a 4) e le frazioni maggiori o minori della metà all'intero più vicino. Quando si dividono gli BigDecimaloggetti, ci viene richiesto di specificare come verrà arrotondato il risultato. Per questo articolo, arrotonderemo le metà per eccesso. Il seguente programma mostra alcune suddivisioni di esempio:

import java.math. *; import java.text. *; import java.util. *; public class Divide {public static void main (String [] args) {BigDecimal d = new BigDecimal ("1115.32"); BigDecimal giorni = nuovo BigDecimal ("30"); BigDecimal d2 = d.divide (giorni, 2, BigDecimal.ROUND_HALF_UP); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); double money = d2.doubleValue (); Stringa s = n.format (denaro); System.out.println (s); }}

L'output del programma precedente è:

7.18 

Calcolo degli interessi

Per questo esempio, supponiamo che una somma di 500 riceverà pagamenti di interessi a un tasso annuo del 6,7%. I pagamenti verranno calcolati trimestralmente e noi calcoleremo il primo pagamento trimestrale. Per fare ciò, useremo la formula I = PRT , dove I è l'importo dell'interesse, P è il capitale (9.500), R è il tasso (6,7% annuo) e T è il tempo (0,25 anni). Il programma è:

import java.math. *; import java.text. *; import java.util. *; public class Interesse {public static void main (String [] args) {BigDecimal principal = new BigDecimal ("9500.00"); Tasso BigDecimal = nuovo BigDecimal ("0,067"); BigDecimal time = nuovo BigDecimal ("0,25"); BigDecimal temp = principal.multiply (rate); BigDecimal interest = temp.multiply (tempo); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); double money = interest.doubleValue (); Stringa s = n.format (denaro); System.out.println ("Interesse primo trimestre:" + s); }}

L'output del programma precedente è:

Interessi nel primo trimestre: 59.12 

Operazioni in fondi comuni di investimento

In questo esempio, un investitore possiede 754.495 azioni in un fondo comune di investimento. L'investitore effettua un ulteriore acquisto di 00,00 di azioni a 0,38 per azione. Useremo il seguente programma Java per rispondere a due domande: quante azioni possiede l'investitore dopo l'acquisto e qual è l'attuale valore di mercato del conto dopo l'acquisto? Assumeremo che il fondo comune di investimento tenga traccia dei numeri delle azioni con tre cifre decimali:

import java.math. *; import java.text. *; import java.util. *; public class Mutual {public static void main (String [] args) {BigDecimal share = new BigDecimal ("754.495"); BigDecimal purchaseAmount = new BigDecimal ("200.00"); BigDecimal pricePerShare = nuovo BigDecimal ("10,38"); BigDecimal sharePurchased = purchaseAmount.divide (pricePerShare, 3, BigDecimal.ROUND_HALF_UP); share = share.add (sharePurchased); BigDecimal accountValue = share.multiply (pricePerShare); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); double dAccountValue = accountValue.doubleValue (); String sAccountValue = n.format (dAccountValue); System.out.println ("Numero di condivisioni =" + share.toString ()); System.out.println ("Account value =" + sAccountValue); }}

Il programma di cui sopra produce:

Numero di azioni = 773.763 Valore del conto =, 031.66 

Più formattazione

Nell'esempio precedente, il numero di condivisioni sembra essere inferiore a 1.000. Se fosse stato maggiore di 1.000, il programma avrebbe emesso il numero senza virgola per separare la posizione delle migliaia dalle altre cifre. Possiamo creare un NumberFormatoggetto per formattare i numeri in stile americano (virgole separano migliaia, punti separano decimali) utilizzando:

NumberFormat n2 = NumberFormat.getInstance (Locale.US); 

Modificando il programma precedente per aumentare il numero di condivisioni a più di 1.000 e per visualizzare il numero di condivisioni formattate come desideriamo, abbiamo:

import java.math. *; import java.text. *; import java.util. *; public class Mutual2 {public static void main (String [] args) {BigDecimal share = new BigDecimal ("1754.495"); BigDecimal purchaseAmount = new BigDecimal ("2000.00"); BigDecimal pricePerShare = nuovo BigDecimal ("10,38"); BigDecimal sharePurchased = purchaseAmount.divide (pricePerShare, 3, BigDecimal.ROUND_HALF_UP); share = share.add (sharePurchased); BigDecimal accountValue = share.multiply (pricePerShare); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); double dAccountValue = accountValue.doubleValue (); String sAccountValue = n.format (dAccountValue); NumberFormat n2 = NumberFormat.getInstance (Locale.US); double dShares = share.doubleValue (); String sShares = n2.format (dShares); System.out.println ("Numero di condivisioni =" + sShares);System.out.println ("Account value =" + sAccountValue); }}

La versione modificata (direttamente sopra) ora restituisce:

Numero di azioni = 1.947,173 Valore del conto = 0,211,66 

Avvertenze

Se stai scrivendo un programma da cui dipenderai tu o altri per i calcoli finanziari, ha senso essere il più attento possibile. Innanzitutto, verifica accuratamente il tuo programma. In secondo luogo, consultare professionisti, come contabili, in caso di dubbi sulla formula corretta, regola di arrotondamento o qualsiasi altro aspetto monetario.

Riassumendo

BigDecimalgli oggetti, che rappresentano i valori, possono essere aggiunti, sottratti, moltiplicati e divisi. Sebbene sia possibile visualizzare BigDecimaloggetti utilizzando il toString()metodo, spesso è preferibile creare un NumberFormatoggetto da cui doublesottenere il formato BigDecimal. Ora puoi aggiungere il valore di fare semplici calcoli di interessi e transazioni di fondi comuni nei tuoi programmi Java.

Robert Nielsen è un programmatore Java 2 certificato Sun. Ha conseguito un master in pedagogia, specializzato in istruzione assistita dal computer, e ha insegnato nel campo dei computer per diversi anni. Ha anche pubblicato articoli relativi al computer in una varietà di riviste.