Hogyan kerekítsünk egy számot N tizedesjegyig a Java-ban

1. Áttekintés

Ebben a rövid cikkben megvizsgáljuk, hogyan lehet kerekíteni egy számot n tizedesjegyek Java-ban.

2. Tizedes számok Java-ban

A Java két primitív típust kínál, amelyek használhatók a tizedesjegyek tárolására: úszó és kettős. Kettős az alapértelmezés szerint használt típus:

kettős PI = 3,1415;

Mindkét típus azonban soha nem szabad pontos értékekre használni, például a valuták. Ehhez és a kerekítéshez is használhatjuk a BigDecimal osztály.

3. Tizedes szám formázása

Ha csak egy tizedes számot akarunk kinyomtatni a n a tizedesjegy utáni számjegyekkel egyszerűen formázhatjuk a kimeneti karakterláncot:

System.out.printf ("Érték 3 számjeggyel a tizedespont után% .3f% n", PI); // OUTPUTS: 3 jegyű érték tizedespont után 3.142

Alternatív megoldásként az értéket formázhatjuk a DecimalFormat osztály:

DecimalFormat df = new DecimalFormat ("###. ###"); System.out.println (df.formátum (PI));

DecimalFormat lehetővé teszi számunkra, hogy kifejezetten beállítsuk a kerekítési magatartást, jobban kontrollálva a kimenetet, mint String.format () fent használt.

4. Kerekítés Kettőss With BigDecimal

Kerekíteni kettőss to n tizedesjegyek, írhatunk a segítő módszer:

privát statikus kettős kör (dupla érték, int helyek) {if (helyek <0) új IllegalArgumentException () dob; BigDecimal bd = új BigDecimal (Double.toString (érték)); bd = bd.setScale (helyek, RoundingMode.HALF_UP); return bd.doubleValue (); }

Ebben a megoldásban egy fontos dolgot kell észrevenni - a konstrukció során BigDecimal; nekünk kell mindig használja BigDecimal (karakterlánc) konstruktőr. Ez megakadályozza a pontatlan értékek képviseletével kapcsolatos problémákat.

Ugyanezt elérhetjük az Apache Commons Math könyvtár használatával:

 org.apache.commons commons-math3 3.5 

A legújabb verzió itt található.

Miután a könyvtár hozzá lett adva a projekthez, használhatjuk a Precision.round () módszer, amely két argumentumot vesz igénybe - érték és skála:

Pontosság. Kör (PI, 3);

Alapértelmezés szerint ugyanazt használja HALF_UP kerekítési módszer, mint segítő módszerünk. Ezért az eredményeknek ugyanazoknak kell lenniük.

Vegye figyelembe, hogy a kerekítési viselkedést úgy módosíthatjuk, hogy harmadik paraméterként átadjuk a kívánt kerekítési módszert.

5. A párosok lekerekítése DoubleRounder

DoubleRounder egy segédprogram a decimal4j könyvtárban. Gyors és szemétmentes módszert kínál a duplázás 0 és 18 tizedesjegy közötti kerekítésére.

A könyvtárat (a legújabb verzió itt található) úgy kapjuk meg, hogy hozzáadjuk a függőséget a pom.xml:

 org.decimal4j decimal4j 1.0.3 

Most egyszerűen használhatjuk:

DoubleRounder.round (PI, 3);

Azonban, DoubleRounder néhány forgatókönyv esetén kudarcot vall, például:

System.out.println (DoubleRounder.round (256.025d, 2)); // KIMENETEK: 256,02 a várt 256,03 helyett

6. Math.round () módszer

A számok kerekítésének másik módja a Math.Round () metódus használata.

Ebben az esetben ellenőrizhetjük n a tizedesjegyek száma szorozva és elosztva 10 ^ n:

nyilvános statikus kettős körAvoid (kettős érték, int helyek) {kettős skála = Math.pow (10, helyek); return Math.round (érték * skála) / skála; }

Ez a módszer nem ajánlott, mivel csonkítja az értéket. Sok esetben az értékeket helytelenül kerekítik:

System.out.println (roundAvoid (1000.0d, 17)); // KIMENETEK: 92.23372036854776 !! System.out.println (roundAvoid (260.775d, 2)); // KIMENETEK: 260,77 a várt 260,78 helyett

Tehát, ez a módszer itt csak tanulási célokra szerepel.

7. Következtetés

Ebben a gyors bemutatóban különféle technikákat ismertettünk a számok kerekítésére n tizedes jel.

Egyszerűen formázhatjuk a kimenetet az érték megváltoztatása nélkül, vagy kerekíthetjük a változót egy segítő módszer segítségével. Áttekintettünk néhány könyvtárat, amelyek ezzel a problémával foglalkoznak.

A vita során használt kód megtalálható a GitHub oldalon.