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.