JavaRush /Blog Jawa /Random-JV /BigDecimal ing Jawa

BigDecimal ing Jawa

Diterbitake ing grup
Hello! Ing kuliah dina iki kita bakal ngomong babagan jumlah gedhe. Ora, bab sing BIG tenan. Sadurunge , kita wis ndeleng tabel rentang nilai kanggo jinis data primitif luwih saka sepisan. Katon kaya mangkene:
Tipe primitif Ukuran ing memori Range saka nilai
bait 8 bit -128 kanggo 127
cendhak 16 bit kanggo -32768 kanggo 32767
char 16 bit saka 0 kanggo 65536
int 32 bit saka -2147483648 kanggo 2147483647
dawa 64 bit saka -9223372036854775808 nganti 9223372036854775807
ngambang 32 bit saka (2 kanggo daya -149) kanggo ((2-2 kanggo daya -23)*2 kanggo daya 127)
pindho 64 bit saka (-2 kanggo daya 63) kanggo ((2 kanggo daya saka 63) - 1)
boolean 8 (yen digunakake ing array), 32 (yen digunakake ing non-array) bener utawa salah
Yen kita ngomong babagan integer, jinis data sing paling gedhe yaiku dawa , lan nalika kita ngomong babagan nomer floating point, kaping pindho . Nanging kepiye yen jumlah sing kita butuhake akeh banget nganti ora cocog karo dawa ? Kisaran nilai Long bisa cukup gedhe, nanging isih winates ing ukuran tartamtu - 64 bit. Apa sing bisa ditindakake yen Nomer Gedhe banget bobote 100 bit? Untunge, sampeyan ora perlu nggawe apa-apa. Ing Jawa, rong kelas khusus digawe kanggo kasus kasebut - BigInteger (kanggo integer) lan BigDecimal (kanggo angka floating-point). Apa fitur sing? Kaping pisanan, kanthi teoritis ora duwe ukuran maksimal. Secara teoritis, amarga ora ana komputer kanthi memori tanpa wates. Lan yen sampeyan nggawe nomer ing program sing luwih gedhe tinimbang ukuran memori komputer, mesthine program kasebut ora bisa digunakake. Nanging kasus kaya mengkono ora mungkin. Mulane, kita bisa ngomong sing ukuran nomer sacoro prakteke BigIntegerUnlimited BigDecimal. Kelas-kelas iki digunakake kanggo apa? Kaping pisanan, kanggo petungan kanthi syarat akurasi sing dhuwur banget. Ana, contone, program kang urip manungsa bisa gumantung ing akurasi petungan (software kanggo pesawat lan roket utawa kanggo peralatan medical). Mulane, yen malah panggonan desimal kaping 150 nduweni peran penting, BigDecimaliku pilihan sing paling apik. Kajaba iku, cukup asring obyek kasebut digunakake ing jagad keuangan, ing ngendi akurasi pitungan nganti nilai sing paling cilik uga penting banget. Kepiye cara nggarap obyek BigIntegerlan BigDecimalapa sing penting kanggo elinga? 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);
   }
}
Nglewati senar minangka parameter mung salah siji saka konstruktor bisa. Kene kita nggunakake strings amarga nomer kita ngluwihi nilai maksimum longlan double, lan piye wae kita kudu nerangake kanggo compiler persis nomer apa kita pengin njaluk :) Cukup pass nomer 111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111. ora bakal bisa: Jawa bakal nyoba "pas" nomer liwati menyang salah siji jinis data primitif, nanging ora bakal pas karo salah siji saka wong-wong 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 akeh yaiku obyek sing ora bisa diganti ( Immutable) . Sampeyan wis kenal karo prinsip immutability liwat conto kelas Stringlan kelas pambungkus kanggo primitif (Integer, Long lan liya-liyane).
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:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
Jumlah kita ora owah, kaya sing dikarepake. Supaya operasi tambahan bisa sukses, sampeyan kudu nggawe obyek anyar lan nemtokake asil tambahan kasebut.
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:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111144444444
Saiki kabeh bisa digunakake :) Miturut cara, apa sampeyan sok dong mirsani carane mboten umum operasi tambahan katon?
BigInteger result = integer.add(BigInteger.valueOf(33333333));
Iki minangka titik penting liyane. Kelas nomer gedhe ora nggunakake operator +-*/ ing operasi, nanging menehi sawetara cara. Ayo goleki sing utama (sampeyan bisa, kaya biasane, golek dhaptar lengkap metode ing dokumentasi Oracle: kene lan kene ).
  1. cara kanggo nindakake operasi aritmetika: add() , subtract(), multiply(), divide(). Digunakake kanggo operasi tambahan, subtraction, multiplikasi lan divisi.

  2. doubleValue(), intValue(), floatValue(), longValue()lsp. - Digunakake kanggo ngowahi jumlah gedhe menyang jinis primitif Jawa. Ati-ati nalika nggunakake lan elinga bedane kapasitas!

    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()- ngidini sampeyan nemokake nilai minimal lan maksimum rong nomer gedhe liwati.
    Wigati dimangerteni: metode 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

Kontrol pembulatan BigDecimal

Topik iki kalebu ing bagean kapisah, wiwit dibunderaké nomer akeh lan nyetel iku dudu bab prasaja. Sampeyan bisa nyetel nomer panggonan desimal kanggo nomer BigDecimalnggunakake setScale(). Contone, kita pengin nyetel presisi nomer 111.5555555555 nganti telung desimal. Nanging, kita ora bakal bisa ngliwati nomer 3 minangka argumen kanggo metode kasebut setScale()lan kanthi mangkono ngatasi masalah kita. Kaya sing kasebut ing ndhuwur, BigDecimaliki minangka nomer kanggo pitungan kanthi akurasi tambah. Ing wangun saiki, nomer kita duwe 10 panggonan desimal. Kita pengin mbuwang 7 lan ninggalake mung 3. Mulane, saliyane nomer 3, kita kudu ngliwati mode pembulatan minangka parameter . Ana 8 mode pembulatan total BigDecimal. Cukup akeh! Nanging yen sampeyan kudu bener-bener nyetel akurasi petungan ing program kasebut, sampeyan bakal duwe kabeh sing dibutuhake kanggo iki. Dadi, iki 8 mode pembulatan sing kasedhiya ing BigDecimal:
  1. ROUND_CEILING- nglumpukake

    111.5555555555 -> setScale(3, ROUND_CEILING) -> 111.556
  2. ROUND_DOWN- discharge discarding

    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é munggah yen nomer sawise titik desimal >= .5

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

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

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

    Nomer ing sisih kiwa titik desimal - 2 - malah. Rounding dumadi mudhun. Amarga kita mbutuhake 0 panggonan desimal, asile bakal dadi 2.

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

    Nomer ing sisih kiwa titik desimal - 3 - ganjil. Rounding dumadi munggah. Amarga kita mbutuhake 0 panggonan desimal, asile bakal dadi 4.

  7. ROUND_UNNECCESSARY- digunakake ing kasus ngendi mode babak kudu liwati kanggo sawetara cara, nanging nomer ora perlu dibunderaké. Yen sampeyan nyoba ngubengi nomer nalika mode ROUND_UNNECCESSARY disetel, ArithmeticException dibuwang.

    3.51 -> setScale(1, ROUND_UNNECCESSARY) -> ArithmeticException
  8. ROUND_UP- nglumpukake.

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

Perbandingan jumlah gedhe

Pitakonan iki uga penting. Sampeyan wis ngelingi yen cara iki digunakake kanggo mbandhingake obyek ing basa Jawa equals(). Iki diwenehake dening basa dhewe (ing kasus kelas sing dibangun ing Jawa) utawa diganti dening programmer. Nanging ing cilik saka obyek kelas, iku ora dianjurake BigDecimalkanggo nggunakake cara equals()kanggo comparison. Alesan kanggo iki yaiku BigDecimal.equals()metode nomer loro bali mung yen nomer loro kasebut duwe nilai lan skala sing padha : Ayo mbandhingake prilaku metode equals()y Doublelan y 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
Kaya sing sampeyan ngerteni, angka 1,5 lan 1,50 ing kasus c BigDecimaldadi ora padha! Iki kedadeyan amarga spesifik metode equals()ing kelas BigDecimal. Kanggo mbandhingake sing luwih bener saka loro, BigDecimalluwih 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
Cara kasebut compareTo()ngasilake 0, tegese padha karo 1,5 lan 1,50. Iki minangka asil sing kita ngarepake! :) Iki rampung pelajaran kita kanggo dina iki. Wektu kanggo bali menyang tugas! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION