Sådan afrundes et tal til N decimaler i Java

1. Oversigt

I denne korte artikel vil vi se på, hvordan man afrunder et tal til n decimaler i Java.

2. Decimaltal i Java

Java giver to primitive typer, der kan bruges til lagring af decimaltal: flyde og dobbelt. Dobbelt er den anvendte type som standard:

dobbelt PI = 3,1415;

Imidlertid begge typer bør aldrig bruges til nøjagtige værdier, såsom valutaer. Til det og også til afrunding kan vi bruge BigDecimal klasse.

3. Formatering af et decimaltal

Hvis vi bare vil udskrive et decimaltal med n cifre efter decimaltegn, kan vi simpelthen formatere outputstrengen:

System.out.printf ("Værdi med 3 cifre efter decimaltegn% .3f% n", PI); // OUTPUTS: Værdi med 3 cifre efter decimaltegn 3.142

Alternativt kan vi formatere værdien med Decimalformat klasse:

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

Decimalformat giver os mulighed for eksplicit at angive afrundingsadfærd, hvilket giver mere kontrol over output end String.format () anvendt ovenfor.

4. Afrunding Dobbelts Med BigDecimal

At runde dobbelts til n decimaler, kan vi skrive en hjælper metode:

privat statisk dobbelt runde (dobbelt værdi, int steder) {hvis (steder <0) smider nyt IllegalArgumentException (); BigDecimal bd = ny BigDecimal (Double.toString (værdi)); bd = bd.setScale (steder, RoundingMode.HALF_UP); returner bd.doubleValue (); }

Der er en vigtig ting at bemærke i denne løsning - når man konstruerer BigDecimal; vi skal brug altid BigDecimal (streng) konstruktør. Dette forhindrer problemer med at repræsentere unøjagtige værdier.

Vi kan opnå det samme ved hjælp af Apache Commons Math-biblioteket:

 org.apache.commons commons-math3 3.5 

Den seneste version kan findes her.

Når biblioteket er føjet til projektet, kan vi bruge Precision.round () metode, der tager to argumenter - værdi og skala:

Precision.round (PI, 3);

Som standard bruger det det samme HALF_UP afrundingsmetode som vores hjælpemetode. Derfor skal resultaterne være de samme.

Bemærk, at vi kan ændre afrundingsadfærd ved at sende den ønskede afrundingsmetode som en tredje parameter.

5. Afrunding fordobles med DoubleRounder

DoubleRounder er et hjælpeprogram i decimal4j-biblioteket. Det giver en hurtig og affaldsfri metode til afrunding af fordobling fra 0 til 18 decimaler.

Vi kan få biblioteket (den nyeste version kan findes her) ved at tilføje afhængigheden af pom.xml:

 org.decimal4j decimal4j 1.0.3 

Nu kan vi simpelthen bruge:

DoubleRounder.round (PI, 3);

Imidlertid, DoubleRounder mislykkes i nogle få scenarier, for eksempel:

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

6. Math.round () metode

En anden måde at afrunde tal på er at bruge Math.Round () -metoden.

I dette tilfælde kan vi kontrollere n antal decimaler ved at gange og dividere med 10 ^ n:

offentlig statisk dobbelt roundAvoid (dobbelt værdi, int steder) {dobbelt skala = Math.pow (10, steder); returner Math.round (værdi * skala) / skala; }

Denne metode anbefales ikke, da den afkortes værdien. I mange tilfælde afrundes værdier forkert:

System.out.println (roundAvoid (1000.0d, 17)); // OUTPUTS: 92.23372036854776 !! System.out.println (roundAvoid (260.775d, 2)); // OUTPUTS: 260.77 i stedet for forventet 260.78

Og så er denne metode kun angivet her til læringsformål.

7. Konklusion

I denne hurtige vejledning dækkede vi forskellige teknikker til afrunding af tal til n decimaler.

Vi kan simpelthen formatere output uden at ændre værdien, eller vi kan afrunde variablen ved hjælp af en hjælpemetode. Vi har også dækket et par biblioteker, der håndterer dette problem.

Koden, der blev brugt under diskussionen, kan findes på GitHub.