KodeGym/Blog Jawa/Acak/BigDecimal ing Jawa
John Squirrels
tingkat
San Francisco

BigDecimal ing Jawa

Diterbitake ing grup
Hi! Ing wulangan dina iki, kita bakal ngomong babagan jumlah gedhe. Ora, maksudku BIG tenan. Kita wis bola -bali nemoni tabel kisaran nilai kanggo jinis data primitif. Katon kaya mangkene:
Tipe primitif Ukuran ing memori Range nilai
bait 8 bit -128 kanggo 127
cendhak 16 bit -32768 kanggo 32767
char 16 bit 0 kanggo 65536
int 32 bit -2147483648 kanggo 2147483647
dawa 64 bit -9223372036854775808 kanggo 9223372036854775807
ngambang 32 bit (2 kanggo daya saka -149) kanggo ((2 kanggo daya saka -23) * 2 kanggo daya saka 127)
pindho 64 bit (-2 kanggo daya saka 63) kanggo ((2 kanggo daya saka 63) - 1)
boolean 8 (nalika digunakake ing larik), 32 (yen ora digunakake ing larik) bener utawa salah
Tipe data integer paling jembar yaiku long . Nalika nerangake nomer floating-point, iku pindho . Nanging kepiye yen jumlah sing kita butuhake akeh banget nganti ora cocog karo sing dawa ? Jinis data Long duwe sawetara cukup akeh nilai bisa, nanging isih winates kanggo 64 bit. Apa sing kudu ditindakake yen Nomer Gedhe banget mbutuhake 100 bit? Untunge, kita ora perlu nggawe apa-apa. Kanggo kasus kaya iki, Jawa duwe rong kelas khusus: BigInteger (kanggo integer) lan BigDecimal(kanggo angka floating-point). Apa ndadekake wong-wong mau khusus? Kaping pisanan, ing teori, dheweke ora duwe ukuran maksimal. Kita ngomong "ing teori", amarga ora ana komputer karo memori tanpa wates. Lan yen program sampeyan nggawe nomer sing luwih gedhe tinimbang jumlah memori sing kasedhiya, mula program kasebut ora bakal bisa digunakake, mesthi. Nanging kasus kaya mengkono ora mungkin. Akibaté, kita bisa ngomong sing BigInteger lan BigDecimal bisa makili nomer saka ukuran sakbenere Unlimited. Kelas-kelas iki digunakake kanggo apa? Kaping pisanan, kanggo petungan kanthi syarat akurasi sing ketat banget. Contone, urip manungsa bisa uga gumantung ing akurasi etungan ing sawetara program (contone, piranti lunak sing ngontrol pesawat, roket, utawa peralatan medis). Dadi yen panggonan desimal 150 iku penting, banjur BigDecimaliku pilihan sing paling apik. Kajaba iku, obyek saka kelas iki asring digunakake ing donya finance, ngendi pitungan akurat malah nilai paling cilik uga arang banget penting. Kepiye cara nggarap obyek BigInteger lan BigDecimal lan sampeyan kudu ngerti babagan? Objek saka kelas kasebut digawe kaya iki:
public class Main {

   public static void main(String[] args) {

       BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
       System.out.println(integer);

       BigDecimal decimal = new BigDecimal("123.444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444");
       System.out.println(decimal);
   }
}
Maringake senar menyang konstruktor mung minangka salah sawijining pilihan. Ing kene kita nggunakake strings, amarga nomer kita ngluwihi nilai maksimum kanggo long lan pindho , lan kita mbutuhake sawetara cara kanggo nerangake kanggo compiler nomer sing arep kita nggawe :) Cukup maringaken nomer 11111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 kanggo konstruktor ora bisa: Jawa bakal nyoba kanggo cram nomer liwati menyang salah siji saka jinis data primitif, nanging ora pas karo samubarang mau. Mulane nggunakake senar kanggo pass nomer sing dikarepake iku pilihan apik. Loro-lorone kelas bisa kanthi otomatis ngekstrak nilai numerik saka senar sing dilewati. Titik penting liyane sing kudu dielingi nalika nggarap kelas nomer gedhe yaiku obyek sing ora bisa diganti ( Immutable ). Sampeyan wis kenal karo immutability amarga pengalaman sampeyan karo kelas String lan kelas bungkus kanggo jinis primitif (Integer, Long, lsp.).
import java.math.BigInteger;

public class Main {

   public static void main(String[] args) {

       BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
       System.out.println(integer);

       integer.add(BigInteger.valueOf(33333333));
       System.out.println(integer);

   }
}
Output konsol:
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
Kaya sing dikarepake, nomer kita ora owah. Kanggo nindakake operasi tambahan, sampeyan kudu nggawe obyek anyar kanggo nampa asil operasi.
import java.math.BigInteger;

public class Main {

   public static void main(String[] args) {

       BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
       System.out.println(integer);

       BigInteger result = integer.add(BigInteger.valueOf(33333333));
       System.out.println(result);

   }
}
Output konsol:
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111144444444
Delengen, saiki kabeh bisa digunakake :) Ngomong-ngomong, sampeyan ngerti kepiye operasi tambahan sing ora biasa?
BigInteger result = integer.add(BigInteger.valueOf(33333333));
Iki minangka titik penting liyane. Kelas nomer gedhe ora nggunakake operator + - * /. Nanging, padha nyedhiyani pesawat saka cara. Ayo dadi kenalan karo sing utama (kaya biasane, sampeyan bisa nemokake dhaptar lengkap metode ing dokumentasi Oracle: kene lan kene ).
  1. cara kanggo operasi aritmetika: nambah () , nyuda () , multiply () , dibagi () . Cara kasebut digunakake kanggo nindakake tambahan, pengurangan, perkalian lan pembagian.

  2. doubleValue () , intValue () , floatValue () , longValue () , etc.. digunakake kanggo ngowahi nomer amba kanggo salah siji jinis primitif Jawa. Ati-ati nalika nggunakake cara kasebut. Aja lali babagan beda ukuran bit!

    import java.math.BigInteger;
    
    public class Main {
    
       public static void main(String[] args) {
    
           BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
    
           long result = integer.longValue();
           System.out.println(result);
    
       }
    }

    Output konsol:

    8198552921648689607
  3. min () lan max () ngijini sampeyan nemokake nilai minimal lan maksimum rong nomer amba.
    Elinga yen cara iki ora statis!

    import java.math.BigInteger;
    
    public class Main {
    
       public static void main(String[] args) {
    
           BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
           BigInteger integer2 = new BigInteger("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222");
    
           System.out.println(integer.max(integer2));
    
       }
    }

    Output konsol:

    222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222

Prilaku bunder BigDecimal

Topik iki duwe bagean kapisah dhewe, wiwit dibunderaké nomer amba lan configuring prilaku dibunderaké ora supaya prasaja. Sampeyan bisa nggunakake cara setScale () kanggo nyetel nomer panggonan desimal kanggo BigDecimal a . Contone, umpamane kita pengin nomer 111.5555555555 duwe telung digit sawise titik desimal. Nanging, kita ora bisa entuk apa sing dikarepake kanthi menehi nomer 3 minangka argumen kanggo metode setScale () . Kaya kasebut ing ndhuwur, BigDecimalyaiku kanggo makili nomer kanthi syarat ketat babagan presisi komputasi. Ing wangun saiki, nomer kita duwe 10 digit sawise titik desimal. Kita pengin nyelehake 7 mau lan tetep mung 3. Mulane, saliyane nomer 3, kita kudu ngliwati mode pembulatan. BigDecimal duwe total 8 mode pembulatan. Sing akeh! Nanging yen sampeyan pancene kudu nyetel presisi petungan, sampeyan bakal duwe kabeh sing dibutuhake. Dadi, iki 8 mode pembulatan sing ditawakake BigDecimal :
  1. ROUND_CEILING - dibunderaké

    111.5555555555 -> setScale(3, ROUND_CEILING) -> 111.556
  2. ROUND_DOWN - babak menyang nol

    111.5555555555 -> setScale(3, ROUND_DOWN) -> 111.555
  3. ROUND_FLOOR - bunder mudhun

    111.5555555555 -> setScale(3, ROUND_FLOOR) -> 111.555

  4. ROUND_HALF_UP - dibunderaké yen angka sawise titik desimal >= 0,5

    0.55 -> setScale(1, ROUND_HALF_UP) -> 0.6
    0.54 -> setScale(1, ROUND_HALF_UP) -> 0.5
  5. ROUND_HALF_DOWN - dibunderaké yen nomer sawise titik desimal> 0,5

    0.55 -> setScale(1, ROUND_HALF_DOWN) -> 0.5
    0.56 -> setScale(1, ROUND_HALF_DOWN) -> 0.6
  6. ROUND_HALF_EVEN — dibunderaké gumantung saka nomer ing sisih kiwa titik desimal. Yen nomer ing sisih kiwa malah, dibunderaké bakal mudhun. Yen nomer ing sisih kiwa titik desimal ganjil, banjur dibunderaké bakal munggah.

    2.5 -> setScale(0, ROUND_HALF_EVEN) -> 2

    Nomer ing sisih kiwa desimal yaiku 2 (genap). Nomer kasebut dibunderaké mudhun. Kita pengin 0 panggonan desimal, dadi asile 2.

    3.5 -> setScale(0, ROUND_HALF_EVEN) -> 4

    Nomer ing sisih kiwa titik desimal yaiku 3 (ganjil). Nomer kasebut dibunderaké. Kita pengin 0 panggonan desimal, dadi asile 4.

  7. ROUND_UNNECCESSARY - Mode iki digunakake nalika sampeyan kudu ngliwati mode pembulatan menyang cara, nanging nomer kasebut ora perlu dibunderake. Yen sampeyan nyoba kanggo muter nomer karo ROUND_UNNECCESSARY mode pesawat, ArithmeticException dibuwang.

    3.51 -> setScale(1, ROUND_UNNECCESSARY) -> ArithmeticException
  8. ROUND_UP - babak adoh saka nol.

    111.5551 -> setScale(3, ROUND_UP) -> 111.556

Mbandhingake nomer gedhe

Iki uga penting. Sampeyan bakal kelingan sing nggunakake padha () cara punika mbandhingaké obyek ing Jawa. Implementasine diwenehake dening basa dhewe (kanggo kelas Jawa standar) utawa ditindhes dening programmer. Nanging ing cilik saka obyek BigDecimal , nggunakake witjaksono () cara kanggo mbandhingaké ora dianjurake. Iki amarga cara BigDecimal.equals () ngasilake bener mung yen 2 nomer duwe nilai lan ukuran padha: Ayo mbandhingaké prilaku saka witjaksono () cara kanggo kelas Double lan BigDecimal :
import java.math.BigDecimal;

public class Main {

   public static void main(String[] args) {

       Double a = 1.5;
       Double b = 1.50;

       System.out.println(a.equals(b));

       BigDecimal x = new BigDecimal("1.5");
       BigDecimal y = new BigDecimal("1.50");

       System.out.println(x.equals(y));

   }
}
Output konsol:
true
false
Nalika sampeyan bisa ndeleng, kanggo BigDecimal , nomer 1,5 lan 1,50 dadi ora padha! Iki sabenere amarga saka spesifik saka implementasine padha () cara ing kelas BigDecimal . Kanggo perbandingan sing luwih akurat saka rong obyek BigDecimal , luwih becik nggunakake metode compareTo () :
import java.math.BigDecimal;

public class Main {

   public static void main(String[] args) {

       BigDecimal x = new BigDecimal("1.5");
       BigDecimal y = new BigDecimal("1.50");

       System.out.println(x.compareTo(y));

   }
}
Output konsol:
0
Metode compareTo () ngasilake 0, tegese 1,5 lan 1,50 padha. Lan iki minangka asil sing dikarepake! :) Sing rampung wulangan kita dina iki. Saiki wayahe bali menyang tugas! :)
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar