Hvordan avrunde et tall til N desimaler i Java

1. Oversikt

I denne korte artikkelen skal vi se på hvordan man avrunder et tall til n desimaler i Java.

2. Desimaltall i Java

Java gir to primitive typer som kan brukes til å lagre desimaltall: flyte og dobbelt. Dobbelt er den typen som brukes som standard:

dobbelt PI = 3,1415;

Imidlertid begge typer skal aldri brukes til presise verdier, for eksempel valutaer. For det, og også for avrunding, kan vi bruke BigDecimal klasse.

3. Formatering av et desimaltall

Hvis vi bare vil skrive ut et desimaltall med n sifre etter desimaltegn, kan vi ganske enkelt formatere utdata String:

System.out.printf ("Verdi med 3 sifre etter desimaltegn% .3f% n", PI); // UTGANGER: Verdi med 3 sifre etter desimaltegn 3.142

Alternativt kan vi formatere verdien med Desimalformat klasse:

DecimalFormat df = ny DecimalFormat ("###. ###"); System.out.println (df.format (PI));

Desimalformat lar oss eksplisitt angi avrundingsadferd, noe som gir mer kontroll over utdata enn String.format () brukt ovenfor.

4. Avrunding Dobbelts Med BigDecimal

Å runde dobbelts til n desimaler, kan vi skrive en hjelpermetode:

privat statisk dobbel runde (dobbel verdi, int steder) {if (steder <0) kaster nytt IllegalArgumentException (); BigDecimal bd = ny BigDecimal (Double.toString (verdi)); bd = bd.setScale (steder, RoundingMode.HALF_UP); returner bd.doubleValue (); }

Det er en viktig ting å legge merke til i denne løsningen - når du konstruerer BigDecimal; vi må bruk alltid BigDecimal (streng) konstruktør. Dette forhindrer problemer med å representere unøyaktige verdier.

Vi kan oppnå det samme ved å bruke Apache Commons Math-biblioteket:

 org.apache.commons commons-math3 3.5 

Den siste versjonen finner du her.

Når biblioteket er lagt til i prosjektet, kan vi bruke Precision.round () metode, som tar to argumenter - verdi og skala:

Precision.round (PI, 3);

Som standard bruker den det samme HALF_UP avrundingsmetode som vår hjelpemetode. Derfor bør resultatene være de samme.

Merk at vi kan endre avrundingsadferd ved å sende den ønskede avrundingsmetoden som en tredje parameter.

5. Avrunding dobler med DoubleRounder

DoubleRounder er et verktøy i desimal4j-biblioteket. Det gir en rask og søppelfri metode for å avrunde dobler fra 0 til 18 desimaler.

Vi kan få biblioteket (den nyeste versjonen finner du her) ved å legge avhengigheten til pom.xml:

 org.decimal4j desimal4j 1.0.3 

Nå kan vi bare bruke:

DoubleRounder.round (PI, 3);

Derimot, DoubleRounder mislykkes i noen få scenarier, for eksempel:

System.out.println (DoubleRounder.round (256.025d, 2)); // UTGANGER: 256.02 i stedet for forventet 256.03

6. Math.round () Metode

En annen måte å avrunde tall på er å bruke Math.Round () -metoden.

I dette tilfellet kan vi kontrollere n antall desimaler ved å multiplisere og dele med 10 ^ n:

offentlig statisk dobbel roundAvoid (dobbel verdi, int steder) {dobbel skala = Math.pow (10, steder); returner Math.round (verdi * skala) / skala; }

Denne metoden anbefales ikke da den avkorter verdien. I mange tilfeller er verdiene avrundet feil:

System.out.println (roundAvoid (1000.0d, 17)); // UTGANGER: 92.23372036854776 !! System.out.println (roundAvoid (260.775d, 2)); // UTGANGER: 260,77 i stedet for forventet 260,78

Og så er denne metoden oppført her kun for læringsformål.

7. Konklusjon

I denne raske veiledningen dekket vi forskjellige teknikker for å avrunde tall til n desimaler.

Vi kan ganske enkelt formatere utdataene uten å endre verdien, eller vi kan runde variabelen ved hjelp av en hjelpemetode. Vi har også dekket noen få biblioteker som håndterer dette problemet.

Koden som ble brukt under diskusjonen finner du på GitHub.