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.