Sådan adskilles dobbelt i heltal og decimaldele

1. Oversigt

I denne vejledning undersøger vi forskellige metoder til at adskille heltal og decimaldele af flydende punkttyper i Java, nemlig flyde og dobbelt.

2. Problemer med typer af flydende punkter

Lad os starte med at se på en simpel brøk og en naiv måde at udføre adskillelsen via støbning på:

dobbelt dobbeltNummer = 24.04; int intPart = (int) doubleNumber; System.out.println ("Dobbeltnummer:" + dobbeltnummer); System.out.println ("Heltalsdel:" + intPart); System.out.println ("Decimal del:" + (doubleNumber - intPart));

Når vi forsøger at køre koden ovenfor, her er hvad vi får:

Dobbeltnummer: 24.04 Heltalsdel: 24 decimaldel: 0,03999999999999915

I modsætning til vores forventning udskriver output ikke decimaldelen korrekt. Derfor er flydepunktsnumrene ikke egnede til beregninger, hvor afrundingsfejl ikke kan tolereres.

3. Første tilgang: Opdeling af Snor

Lad os først og fremmest konvertere decimaltallet til a Snor tilsvarende. Så kan vi opdele Snor ved decimalindekset.

Lad os forstå dette med et eksempel:

dobbelt dobbeltNummer = 24.04; String doubleAsString = String.valueOf (doubleNumber); int indexOfDecimal = doubleAsString.indexOf ("."); System.out.println ("Dobbeltnummer:" + dobbeltnummer); System.out.println ("Heltalsdel:" + doubleAsString.substring (0, indexOfDecimal)); System.out.println ("Decimal del:" + doubleAsString.substring (indexOfDecimal)); 

Output af koden ovenfor er:

Dobbeltnummer: 24.04 Heltalsdel: 24 decimaldel: .04

Resultatet er nøjagtigt hvad vi forventer. Men problemet her er begrænsningen ved at bruge en streng - hvilket betyder, at vi ikke nu kan udføre andre aritmetiske operationer.

4. Anden tilgang: Brug BigDecimal

Det BigDecimal klasse i Java giver sin bruger fuld kontrol over afrundingsadfærd. Denne klasse giver også operationer til aritmetik, skala manipulation, afrunding, sammenligning, hashing og formatkonvertering.

Lad os bruge BigDecimal for at få heltal og decimaldele af et flydende tal:

dobbelt dobbeltNummer = 24.04; BigDecimal bigDecimal = ny BigDecimal (String.valueOf (doubleNumber)); int intValue = bigDecimal.intValue (); System.out.println ("Dobbeltnummer:" + bigDecimal.toPlainString ()); System.out.println ("Heltalsdel:" + intValue); System.out.println ("Decimal del:" + bigDecimal.subtract (ny BigDecimal (intValue)). ToPlainString ());

Outputtet vil være:

Dobbeltnummer: 24.04 Heltalsdel: 24 decimaldel: 0,04

Som vi kan se ovenfor, er output som forventet. Vi kan også udføre aritmetiske operationer ved hjælp af metoderne beskrevet i BigDecimal klasse.

5. Konklusion

I denne artikel diskuterede vi forskellige metoder til at adskille heltal og decimaldele af flydende punkttyper. Vi diskuterede også fordelene ved at bruge BigDecimal til beregning af flydende punkt.

Vores detaljerede vejledning om BigDecimal og BigInteger i Java diskuterer også flere karakteristika og brugsscenarier for de to klasser.

Endelig er den komplette kildekode til denne tutorial tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found