Kako zaokružiti broj na N decimalnih mjesta na Javi

1. Pregled

U ovom ćemo kratkom članku pogledati kako zaokružiti broj na n decimalna mjesta u Javi.

2. Decimalni brojevi u Javi

Java nudi dva primitivna tipa koja se mogu koristiti za pohranu decimalnih brojeva: plutati i dvostruko. Dvostruko je vrsta koja se koristi prema zadanim postavkama:

dvostruki PI = 3,1415;

Međutim, obje vrste nikada se ne smije koristiti za precizne vrijednosti, kao što su valute. Za to, a također i za zaokruživanje, možemo koristiti BigDecimal razred.

3. Oblikovanje decimalnog broja

Ako samo želimo ispisati decimalni broj s n znamenke nakon decimalne točke, možemo jednostavno oblikovati izlazni niz:

System.out.printf ("Vrijednost s 3 znamenke nakon decimalne točke% .3f% n", PI); // IZLAZI: Vrijednost s 3 znamenke nakon decimalne točke 3.142

Ili vrijednost možemo oblikovati pomoću DecimalFormat razred:

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

DecimalFormat omogućuje nam izričito postavljanje ponašanja zaokruživanja, dajući veću kontrolu nad izlazom nego String.format () gore korišteno.

4. Zaokruživanje Dvostrukos Sa BigDecimal

Zaokružiti dvostrukos do n decimalnih mjesta, možemo napisati a pomoćna metoda:

privatni statički dvostruki krug (dvostruka vrijednost, int mjesta) {if (mjesta <0) bacaju novi IllegalArgumentException (); BigDecimal bd = novi BigDecimal (Double.toString (vrijednost)); bd = bd.setScale (mjesta, RoundingMode.HALF_UP); vratiti bd.doubleValue (); }

U ovom rješenju treba primijetiti jednu važnu stvar - prilikom gradnje BigDecimal; moramo uvijek koristiti BigDecimal (niz) konstruktor. To sprječava probleme s predstavljanjem netočnih vrijednosti.

Isto možemo postići korištenjem biblioteke Apache Commons Math:

 org.apache.commons commons-math3 3.5 

Najnoviju verziju možete pronaći ovdje.

Jednom kad se knjižnica doda u projekt, možemo koristiti Precision.round () metoda koja uzima dva argumenta - vrijednost i mjerilo:

Preciznost.okruženje (PI, 3);

Prema zadanim postavkama koristi isto POLUVREME metoda zaokruživanja kao naša pomoćna metoda. Stoga bi rezultati trebali biti jednaki.

Imajte na umu da ponašanje zaokruživanja možemo promijeniti dodavanjem željene metode zaokruživanja kao trećeg parametra.

5. Zaokruživanje parova sa DoubleRounder

DoubleRounder je uslužni program u decimal4j knjižnici. Pruža brzu metodu bez smeća za zaokruživanje parova s ​​0 na 18 decimalnih mjesta.

Knjižnicu možemo dobiti (najnoviju verziju možete pronaći ovdje) dodavanjem ovisnosti na pom.xml:

 org.decimal4j decimal4j 1.0.3 

Sada možemo jednostavno koristiti:

DoubleRounder.round (PI, 3);

Međutim, DoubleRounder ne uspije u nekoliko scenarija, na primjer:

System.out.println (DoubleRounder.round (256.025d, 2)); // IZLAZI: 256.02 umjesto očekivanih 256.03

6. Metoda matematike.okruženje ()

Drugi način zaokruživanja brojeva je uporaba metode Math.Round ().

U ovom slučaju možemo kontrolirati n broj decimalnih mjesta množenjem i dijeljenjem sa 10 ^ n:

javni statički double roundAvoid (dvostruka vrijednost, int mjesta) {dvostruka skala = Math.pow (10, mjesta); return Math.round (vrijednost * ljestvica) / razmjera; }

Ova se metoda ne preporučuje jer skraćuje vrijednost. U mnogim su slučajevima pogrešno zaokružene vrijednosti:

System.out.println (roundAvoid (1000.0d, 17)); // IZLAZI: 92.23372036854776 !! System.out.println (roundAvoid (260.775d, 2)); // IZLAZI: 260,77 umjesto očekivanih 260,78

Dakle, ova je metoda ovdje navedena samo za potrebe učenja.

7. Zaključak

U ovom smo brzom vodiču opisali različite tehnike zaokruživanja brojeva na n decimalna mjesta.

Izlaz možemo jednostavno formatirati bez promjene vrijednosti ili varijablu možemo zaokružiti pomoću pomoćne metode. Također smo pokrili nekoliko knjižnica koje se bave ovim problemom.

Kôd korišten tijekom rasprave može se naći na GitHubu.