Om UiO Studentliv 澳门葡京手机版app下载 For ansatte IT-tjenester Oppslagstavla Bibliotek | |
Du er her:
UiO >
澳门葡京手机版app下载 >
Emner >
MAT-INF1100 - Høst 2004
Om BigDecimal
.
Innledning. F? leser denne informasjonen b? ha lest tilsvarende informasjon om BigInteger
som er en klasse 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 for eksempel 10^(-100) summerer vi derfor til 1/(n+1)! < 10^(-100).
Programmet finner du her.
Redaksjon: Knut M?
Dokument endret: 14. oktober 2004