Du er her:
UiO >
Studier >
Emner >
MAT-INF1100 - Høst 2003
Om BigDecimal
.
Innledning. Vi har tidligere gjort bruk av klassen BigInteger
for �unne programmere med vilk�ig store heltall. Det fins en tilsvarende klasse, , for �egne med flyttall med mange siffer. Her skal vi se litt p�e mest grunnleggende funksjonene for ��tere tall p�code>BigDecimal
-format.
BigDecimal
.
Klassen som inneholder koden for �egne med vilk�ig store heltall heter alts�code>BigDecimal. For �ruke denne klassen m�u �t p�rogramfila si
import java.math.BigDecimal;
Dette gir deg tilgang p�n datatype som heter BigDecimal
. Du kan s�eklarere BigDecimal
-variable ved �i
BigDecimal a;
Hva er en BigDecimal
?
Sifrene i en BigDecimal
representeres ved hjelp av en BigInteger
. I tillegg brukes et 32-bits heltall som (p�ngelsk) refereres til som tallets scale, og som angir hvor mange av sifrene som ligger til h�for desimalpunktet (alts�vor mange desimaler tallet har). Klassen holder stort sett selv orden p�vordan scale skal oppdateres under beregninger. Hvis vi for eksempel ganger sammen to BigDecimal
-tall vil scale for resultatet bli summen av scale for de to faktorene. Unntaket er ved divisjon som vanligvis vil kreve uendelig mange desimaler og dermed uendelig scale, da m�i angi scale for resultatet direkte. Mer om dette finner du under.
Tilordning av verdier. Som for BigInteger
kan vi ikke tilordne verdier direkte til BigDecimal
-variable. P�ebsiden BigDecimal
(se under "Info om Java" under "Ressurser" p�jemmesida) finner du en ganske utf� beskrivelse av klassen.
Som for BigInteger
fins det en metode valueOf
som tar et heltall av type long
som parameter og returnerer en BigDecimal
.
valueOf(long�val)
����������Translates a long value into a BigDecimal with a scale of zero.
Dette betyr at vi kan legge inn 2 som en BigDecimal
i a
ved �i
a = BigDecimal.valueOf(2);
Vi har ogs�n annen mulighet. Under 'Constructor Summary' i klassebeskrivelsen finner vi
BigDecimal(String�val)
����������Translates the String representation of a BigDecimal into a BigDecimal.
Det betyr at hvis a
er en variabel av type BigDecimal
, kan vi si
a = new BigDecimal("2.0")
Det fins ogs�n annen konstrukt�m er beskrevet ved
BigDecimal(double�val)
����������Translates a double into a BigDecimal.
men denne vil ofte kunne gi problemer med avrundingsfeil, pr�r eksempel
a = new BigDecimal(0.1);
og skriv ut svaret. Det er derfor tryggest �ette anf�stegn rundt konstanten og si
a = new BigDecimal("0.1");
For �egge verdien 10^(-50) inn i a
kan vi si
a = new BigDecimal("1.0E-50");
Operasjoner p�code>BigDecimal. I lista over metoder p�ebsida over, s�inner vi
add(BigDecimal�val)
����������Returns a BigDecimal whose value is (this + val), and whose scale is max(this.scale(), val.scale()).
subtract(BigDecimal�val)
divide(BigDecimal�val, int�scale, int�roundingMode)
����������Returns a BigDecimal whose value is (this / val), and whose scale is as specified.
multiply(BigDecimal�val)
����������Returns a BigDecimal whose value is (this * val), and whose scale is (this.scale() + val.scale()).
����������Returns a BigDecimal whose value is (this - val), and whose scale is max(this.scale(), val.scale()).
blant mange andre nyttige metoder. Disse er som forventet bortsett fra divide
. For alle de andre operasjonene over er det alltid mulig �egne ut antall desimaler i resultatet. Dette gj�den i BigDecimal
og bruker dette som resultatets scale slik at ingen sifre g�tapt. Problemet med divisjon er at vi ofte f�uendelig mange desimaler og det er derfor vanligvis umulig �a vare p�lle sammen. Parameteren int scale
til divide
angir hvor mange av desimalene vi �r �a vare p�Resultatet vil s�li avrundet til en BigDecimal
med s�ange desimaler. Den siste parameteren int roundingMode
angir hvordan denne avrundingen skal gj� I boksen 'Field Detail' kan du lese om de forskjellige alternativene. Vanligvis er ROUND_HALF_EVEN
�oretrekke. En divisjon av a
med b
kan da gj�ved
c = a.divide(b,100,BigDecimal.ROUND_HALF_EVEN);
hvis vi regner ut svaret med 100 desimaler, gj�runding som nevnt over og legger svaret i en BigDecimal
som pekes til av c
.
Sammenligninger. Hvis vi gj�meriske beregninger har vi ofte behov for �ammenligne tall, for eksempel n�vi skal avgj�m vi kan stoppe iterasjonene. Til dette finner vi i 'Method Summary'
compareTo(BigDecimal�val)
����������Compares this BigDecimal with the specified BigDecimal.
Dette betyr at du kan sammenligne to variable av type BigDecimal
ved �i a.compareTo(b)
. Resultatet er -1 hvis tallet representert ved a
er mindre enn tallet representert ved b
, det er 0 hvis a
er lik b
og 1 hvis a
er st�enn b
.
Et par andre nyttige funksjoner er
signum()
abs()
����������Returns a BigDecimal whose value is the absolute value of this BigDecimal, and whose scale is this.scale().
����������Returns the signum function of this BigDecimal.
For eksempel vil a.abs()
gi en BigDecimal
som representerer tallverdien til tallet referert av a
.
Et fullstendig program.
For �llustrere hvordan BigDecimal
kan brukes har jeg skrevet et program som regner ut e (grunntallet for naturlige logaritmer) ved �ummere opp rekken 1/0! + 1/1! + 1/2 + 1/3! + ... + 1/n! Det g�an �ise at feilen i denne tiln�ingen til e er mindre enn det neste leddet 1/(n+1)!. For ��eilen mindre enn en for eksempel 10^(-100) summerer vi derfor til 1/(n+1)! < 10^(-100).
Programmet finner du her.
Redaksjon: Knut M�
Dokument endret: 4. oktober 2003