Ako zaokrúhliť číslo na N desatinné miesta v Jave

1. Prehľad

V tomto krátkom článku sa pozrieme na to, ako zaokrúhliť číslo na n desatinné miesta v Jave.

2. Desatinné čísla v Jave

Java poskytuje dva primitívne typy, ktoré možno použiť na ukladanie desatinných čísel: plavák a dvojitý. Dvojitý je typ používaný predvolene:

dvojitý PI = 3,1415;

Avšak obidva typy by sa nikdy nemali používať na presné hodnoty, ako sú meny. Na to a tiež na zaokrúhľovanie môžeme použiť BigDecimal trieda.

3. Formátovanie desatinného čísla

Ak chceme iba vytlačiť desatinné číslo pomocou n číslic za desatinnou čiarkou, môžeme výstupný reťazec jednoducho naformátovať:

System.out.printf ("Hodnota s 3 číslicami za desatinnou čiarkou% .3f% n", PI); // VÝSTUPY: Hodnota s 3 číslicami za desatinnou čiarkou 3.142

Alternatívne môžeme hodnotu naformátovať pomocou DecimalFormat trieda:

DecimalFormat df = nový DecimalFormat ("###. ###"); System.out.println (df.formát (PI));

DecimalFormat umožňuje nám explicitne nastaviť zaokrúhľovacie správanie a poskytnúť väčšiu kontrolu nad výstupom ako String.format () použité vyššie.

4. Zaokrúhľovanie Dvojitýs s BigDecimal

Zaokrúhliť dvojitýs až n desatinné miesta, môžeme napísať a pomocná metóda:

private static double round (double value, int places) {if (places <0) throw new IllegalArgumentException (); BigDecimal bd = nový BigDecimal (Double.toString (hodnota)); bd = bd.setScale (miesta, RoundingMode.HALF_UP); návrat bd.doubleValue (); }

Pri tomto riešení je potrebné si všimnúť jednu dôležitú vec - pri konštrukcii BigDecimal; musíme vždy použiť BigDecimal (reťazec) konštruktér. Tým sa zabráni problémom so zastupovaním nepresných hodnôt.

To isté môžeme dosiahnuť pomocou knižnice Apache Commons Math:

 org.apache.commons commons-math3 3.5 

Najnovšiu verziu nájdete tu.

Po pridaní knižnice do projektu môžeme používať Precision.round () metóda, ktorá vyžaduje dva argumenty - hodnotu a mierku:

Presné okrúhle (PI, 3);

V predvolenom nastavení sa používa to isté HALF_UP metóda zaokrúhľovania ako naša pomocná metóda. Výsledky by preto mali byť rovnaké.

Upozorňujeme, že správanie zaokrúhľovania môžeme zmeniť odovzdaním požadovanej metódy zaokrúhľovania ako tretieho parametra.

5. Zaokrúhľovanie sa zdvojnásobuje DoubleRounder

DoubleRounder je utilita v knižnici decimal4j. Poskytuje rýchlu a bezodpadovú metódu na zaokrúhľovanie na dvojnásobok od 0 do 18 desatinných miest.

Knižnicu (najnovšiu verziu nájdete tu) môžeme získať pridaním závislosti do pom.xml:

 org.decimal4j decimal4j 1.0.3 

Teraz môžeme jednoducho použiť:

DoubleRounder.round (PI, 3);

Avšak DoubleRounder zlyhá v niekoľkých scenároch, napríklad:

System.out.println (DoubleRounder.round (256.025d, 2)); // VÝSTUPY: 256,02 namiesto očakávaných 256,03

6. Metóda Math.round ()

Ďalším spôsobom zaokrúhľovania čísel je použitie metódy Math.Round ().

V takom prípade môžeme ovládať n počet desatinných miest vynásobením a vydelením 10 ^ n:

public static double roundAvoid (double value, int places) {double scale = Math.pow (10, places); návrat Math.round (hodnota * stupnica) / stupnica; }

Táto metóda sa neodporúča, pretože znižuje hodnotu. V mnohých prípadoch sú hodnoty zaokrúhlené nesprávne:

System.out.println (roundAvoid (1000,0d, 17)); // VÝSTUPY: 92.23372036854776 !! System.out.println (roundAvoid (260,775d, 2)); // VÝSTUPY: 260,77 namiesto očakávaných 260,78

A tak je táto metóda uvedená tu iba na študijné účely.

7. Záver

V tomto rýchlom výučbe sme sa venovali rôznym technikám zaokrúhľovania čísel na n desatinné miesta.

Výstup môžeme jednoducho naformátovať bez zmeny hodnoty alebo môžeme premennú zaokrúhliť pomocou pomocnej metódy. Pokryli sme tiež niekoľko knižníc, ktoré sa zaoberajú týmto problémom.

Kód použitý počas diskusie nájdete na GitHub.