Hvordan skille dobbelt i hel- og desimaldeler

1. Oversikt

I denne opplæringen vil vi utforske forskjellige metoder for å skille heltall og desimaler av flytende punkttyper i Java, nemlig flyte og dobbelt.

2. Problemer med flytende poengtyper

La oss begynne med å se på en enkel brøkdel, og en naiv måte å utføre separasjonen via casting:

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

Når vi prøver å kjøre koden ovenfor, får vi følgende:

Dobbeltnummer: 24.04 Heltalsdel: 24 desimaldel: 0,03999999999999915

I motsetning til vår forventning skriver ikke utgangen desimaldelen riktig. Derfor er ikke flytpoengstallene egnet for beregninger der avrundingsfeil ikke kan tolereres.

3. Første tilnærming: Splitting av String

La oss først konvertere desimaltallet til a String tilsvarende. Så kan vi dele String ved desimalindeksen.

La oss forstå dette med et eksempel:

dobbelt dobbelNummer = 24.04; String doubleAsString = String.valueOf (doubleNumber); int indexOfDecimal = doubleAsString.indexOf ("."); System.out.println ("Dobbeltnummer:" + dobbeltnummer); System.out.println ("Integer Part:" + doubleAsString.substring (0, indexOfDecimal)); System.out.println ("Desimal del:" + doubleAsString.substring (indexOfDecimal)); 

Utgangen av koden ovenfor er:

Dobbeltnummer: 24.04 Heltalsdel: 24 desimaldel: .04

Resultatet er akkurat det vi forventer. Men problemet her er begrensningen ved å bruke en streng - noe som betyr at vi ikke vil være i stand til å utføre andre regneoperasjoner nå.

4. Andre tilnærming: Bruk BigDecimal

De BigDecimal klasse i Java gir brukeren full kontroll over avrundingsadferd. Denne klassen gir også operasjoner for regning, skaleringsmanipulering, avrunding, sammenligning, hashing og formatkonvertering.

La oss bruke BigDecimal for å få heltall og desimaldeler av et flytende nummer:

dobbelt dobbelNummer = 24.04; BigDecimal bigDecimal = ny BigDecimal (String.valueOf (doubleNumber)); int intValue = bigDecimal.intValue (); System.out.println ("Dobbeltnummer:" + bigDecimal.toPlainString ()); System.out.println ("Integer Part:" + intValue); System.out.println ("Desimal del:" + bigDecimal.subtract (ny BigDecimal (intValue)). ToPlainString ());

Resultatet blir:

Dobbeltnummer: 24.04 Heltalsdel: 24 desimaldel: 0,04

Som vi kan se ovenfor, er produksjonen som forventet. Vi kan også utføre aritmetiske operasjoner ved hjelp av metodene gitt i BigDecimal klasse.

5. Konklusjon

I denne artikkelen diskuterte vi forskjellige metoder for å skille heltall og desimaler av flytende punkttyper. Vi diskuterte også fordelene ved å bruke BigDecimal for flytende punktberegninger.

I vår detaljerte opplæring om BigDecimal og BigInteger i Java diskuteres også flere egenskaper og bruksscenarier for de to klassene.

Til slutt er den komplette kildekoden for denne opplæringen tilgjengelig på GitHub.


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