JavaRush /Java Blog /Random-ID /BigInteger dan BigDecimal

BigInteger dan BigDecimal

Dipublikasikan di grup Random-ID
Di Java, aplikasi terdiri dari kelas-kelas, dan kelas-kelas terdiri dari metode dan variabel. Variabel, pada gilirannya, dibagi menjadi primitif dan referensi. BigInteger dan BigDecimal - 1Ada 8 jenis variabel di Java dan, tidak termasuk booleandan char, variabel tersebut dibagi menjadi beberapa jenis berikut:
  • bilangan bulat: byte, short, intdan long;
  • floating point (juga disebut bilangan real): floatdan double.
Dalam kelompok kecil ini, perbedaan hanya ada pada rentang nilai yang dapat ditampung (dan, karenanya, ruang yang ditempati variabel tersebut bervariasi). Tipe bilangan bulat terbesar adalah long, dengan rentang dari -9223372036854775808 hingga 9223372036854775807. Dari bilangan floating point, double, dengan rentang 1,7e-308 hingga 1,7e+308. Anda dapat membaca lebih lanjut tentang bilangan real di artikel ini . Namun bagaimana jika kita perlu menyimpan angka yang lebih besar dari kisaran yang dapat diterima? Dalam hal ini, kita membutuhkan BigIntegerdan BigDecimal.

Bilangan Bulat Besar di Jawa

Kelas Java BigIntegerdigunakan sebagai analogi nilai integer dengan panjang sembarang yang tidak memiliki batas panjang 64-bit. Selain itu, ini adalah turunan dari kelas Number, seperti pembungkus standar untuk tipe sederhana numerik - Integer, Long, Byte, Doubledan seterusnya - oleh karena itu ia memiliki implementasi metode yang mengarah ke tipe sederhana:
BigInteger value = new BigInteger("32145");

int intValue = value.intValue();//32145

long longValue = value.longValue();//32145

double doubleValue = value.doubleValue();//32145.0
Segera kita melihat pembuatan objek seperti itu BigIntegerdengan nilai kita diteruskan ke konstruktor, tetapi dalam format string. Perlu dicatat bahwa ia memiliki lebih dari satu desainer, tetapi untuk semua kesempatan. Jika tipe primitif tidak dapat menampung seluruh jumlah data dari BigInteger, data akan dipotong ke rentang tipe primitif tersebut. Tetapi pada saat yang sama, ada analog dari metode ini ( intValueExact(), longValueExact()dll.), dengan satu-satunya perbedaan adalah jika tipe sederhana yang digunakan untuk konversi tidak mengakomodasi rentang data, ArithmeticException akan dilemparkan .

Konstanta Bilangan Bulat Besar

Untuk penggunaan internal, kelas memiliki konstanta:
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
Ini adalah objek konstan BigIntegerdengan nilai masing-masing, 0, 1dan 10.

Metode Bilangan Bulat Besar

Salah satu fitur utama kelas ini adalah penuh dengan metode yang mengimplementasikan operasi aritmatika standar di Java. Misalnya:
  • operasi penjumlahan:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.add(secondValue);//73461
  • operasi perkalian:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.multiply(secondValue);//1347530670
  • operasi mencari sisa pembagian suatu bilangan dengan bilangan lain:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.remainder(secondValue);//2529
  • mendapatkan nilai absolut suatu bilangan (yaitu, modulo, unsigned):

    BigInteger firstValue = new BigInteger("-37995");
    BigInteger resultValue =  firstValue.abs();//37995
Ada juga metode untuk operasi yang lebih kompleks (spesifik):
  • operasi dengan perhitungan mod :

    BigInteger firstValue = new BigInteger("-34");
    BigInteger secondValue = new BigInteger("5");
    BigInteger resultValue = firstValue.mod(secondValue); //1
Ada beberapa variasi berbeda dari fungsi ini:
  • memperoleh nomor acak dan menentukan jumlah bit yang akan digunakan oleh nilai yang dihasilkan:

    BigInteger firstValue = BigInteger.probablePrime(8, new Random());//211
    BigInteger secondValue = BigInteger.probablePrime(16, new Random());//42571
  • operasi pergeseran bitwise (ini >> n)

    Bergeser ke kiri:

    BigInteger firstValue = new BigInteger("5");
    BigInteger firstResultValue = firstValue.shiftLeft(3);//40

    Geser ke kanan:

    BigInteger secondValue = new BigInteger("34");
    BigInteger secondResultValue = secondValue.shiftRight(2); //8
Tentu saja, lebih baik melihat daftar lengkap metode di dokumentasi . BigInteger dan BigDecimal - 2

Desimal Besar di Jawa

Ketika kita membutuhkan bilangan real dengan panjang sembarang, kelas Java digunakan - BigDecimal. Biasanya, ini digunakan untuk bekerja dengan keuangan, bukan double, karena memberikan lebih banyak opsi penyesuaian. Like and BigInteger, BigDecimalmerupakan turunan dari suatu kelas Numberdan memiliki metode yang mengembalikan nilai suatu objek sebagai tipe primitif tertentu:
BigDecimal value = new BigDecimal(35563.3);

long longValue = value.longValue();//35563

double doubleValue = value.doubleValue();//35563.3
Seperti yang bisa kita lihat ketika direduksi menjadi long, hanya bagian bilangan bulat yang tersisa, dan angka desimalnya dibuang.

Konstruktor BigDecimal

Kita akan melihat lebih dekat konstruktornya BigDecimal, karena kelasnya memiliki pilihan yang lebih luas. Ada konstruktor yang memungkinkan Anda menyetel nilai suatu objek dengan cara berbeda (dengan meneruskan int, long, double, Stringdan bahkan BigInteger), dan ada pula yang mengizinkannya. atur pengaturan objek yang dibuat (metode pembulatan, jumlah tempat desimal):
BigDecimal firstValue = new BigDecimal("455656.545");//455656.545
Semuanya jelas di sini, kita langsung mengatur nilai dan jumlah desimal yang ingin kita lihat.
BigDecimal secondValue = new BigDecimal(3445.54);//3445.5399999999999636202119290828704833984375
Hasil dari konstruktor ini bisa sangat tidak terduga, karena kami menentukan double, yang pada dasarnya merupakan tipe yang sangat ambigu. Oleh karena itu, umumnya disarankan untuk digunakan dalam konstruktor String.
BigDecimal thirdValue = new BigDecimal(3445.554645675444, MathContext.DECIMAL32);//3445.555
Kami menetapkan double, tetapi pada saat yang sama kami juga menetapkan parameter yang menjelaskan aturan pembulatan (yang berisi jumlah tempat desimal dan algoritma pembulatan).
char[] arr = new String("455656.545").toCharArray();

BigDecimal fourthValue = new BigDecimal(arr, 2, 6);//5656.5
Kami menetapkan array karakter dari elemen mana kami mengambil nilai untuk objek dan berapa banyak elemen yang kami ambil.
BigDecimal fifthValue = new BigDecimal(new BigInteger("44554"), 3);//44.554
Kami mengambil objek yang sudah ada BigInteger, mengatur jumlah tempat desimal.

Metode Desimal Besar

Kelas ini BigDecimaljuga berisi metode untuk berbagai operasi aritmatika, tetapi BigIntegertidak memiliki metode untuk bekerja dengan bit, seperti . Namun demikian, fitur utamanya BigDecimaladalah fleksibilitas dalam bekerja dengan angka floating point. Mari kita lihat beberapa teknik yang memberi kita kekuatan untuk menguasai bilangan real:
  • kita mendapatkan presisi (jumlah angka):

    BigDecimal value = new BigDecimal("454334.34334");
    int result = value.precision();//11
  • atur jumlah tempat desimal dan aturan pembulatan:

    BigDecimal firstValue = new BigDecimal(3445.544445);
    
    BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_CEILING);//3445.545

    Di bawah ini kita akan melihat lebih dekat konstanta untuk menetapkan aturan pembulatan.

  • bagi BigDecimaldengan yang lain BigDecimal, sambil menunjukkan jumlah tempat desimal yang diperlukan dan aturan pembulatan:

    BigDecimal firstValue = new BigDecimal("455656.545");
    
    BigDecimal secondValue = new BigDecimal(3445.544445);
    
    BigDecimal result = firstValue.divide(secondValue, 2,RoundingMode.DOWN);//132.24
  • memindahkan koma desimal ke kanan/kiri sebanyak beberapa tempat:

    BigDecimal value = new BigDecimal("455656.545");
    BigDecimal firstResult = value.movePointRight (2);//45565654.5
    BigDecimal secondResult = value.movePointLeft (2);//4556.56545
  • potong angka nol di belakangnya:

    BigDecimal value = new BigDecimal("45056.5000");
    BigDecimal result = value.stripTrailingZeros();//45056.5

    Jika kita mempunyai semua angka nol pada bagian riil dan juga terdapat angka nol pada seluruh bagian (atau kita tidak mempunyai tempat desimal sama sekali), maka:

    BigDecimal value = new BigDecimal("450000.000");
    BigDecimal result = value.stripTrailingZeros();//4.5E+5

Aturan pembulatan BigDecimal

Untuk menetapkan aturan pembulatan, di dalamnya BigDecimalkita dapat melihat konstanta khusus yang menjelaskan algoritma pembulatan: ROUND_UP- pembulatan dari nol, pembulatan ke arah bagian nyata:
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_UP );//2.6
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UP );//-2.5
ROUND_DOWN— pembulatan ke nol, yaitu pemotongan bagian sebenarnya:
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_DOWN  );//2.5
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_DOWN  );//-2.6
ROUND_CEILING— pembulatan ke tak terhingga positif. Artinya, jika bilangan kita positif maka -> ROUND_UP, jika negatif maka ->ROUND_DOWN
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_CEILING);//2.6
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_CEILING);//-2.5
ROUND_FLOOR- pembulatan ke negatif tak terhingga, yaitu jika bilangan kita positif maka -> ROUND_DOWN, jika negatif maka ->ROUND_UP
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_FLOOR);//2.5
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_FLOOR);//-2.6
Untuk nilai yang dipertimbangkan, kita akan menganggap bilangan terdekat dengan tempat desimal terpotong ini sebagai tetangga terdekat dari bilangan yang dipertimbangkan. Misalnya, 2,43 akan lebih dekat ke 2,4 daripada 2,5, namun 2,48 akan lebih dekat ke 2,5. ROUND_HALF_DOWN— pembulatan ke “tetangga terdekat”. Jika kedua tetangga berjarak sama dari suatu nilai tertentu, maka dilakukan pembulatan ke nol. Jarak yang sama misalnya bila bilangan yang dibulatkan adalah 5 dan jarak antara 0 dan 10 sama):
BigDecimal firstValue = new BigDecimal("2.58");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_HALF_DOWN );//2.6
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_HALF_DOWN );//2.5
ROUND_HALF_UP— mode untuk pembulatan menuju “tetangga terdekat”. Jika kedua tetangga berjarak sama, maka dilakukan pembulatan ke atas (ini adalah pembulatan yang sama yang diajarkan di sekolah):
BigDecimal firstValue = new BigDecimal("2.53");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_HALF_UP  );//2.5
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_HALF_UP  );//2.6
ROUND_HALF_EVEN— pembulatan ke “tetangga terdekat” jika jarak kedua tetangga tidak sama. Dalam hal ini, jika bilangan yang dibulatkan didahului dengan bilangan ganjil maka dibulatkan ke atas, dan jika bilangan genap dibulatkan ke bawah:
BigDecimal firstValue = new BigDecimal("2222.2225");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.222
Hasil ini kita peroleh karena saat pembulatan, 5 melihat ke angka 2 sebelumnya, dan karena genap, maka dibulatkan ke bawah. Tapi jika:
BigDecimal firstValue = new BigDecimal("2222.22255");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.223
Pembulatan itu naik, karena 5 yang terakhir melihat nilai sebelumnya dan melihat angka ganjil. Hasilnya, angka tersebut dibulatkan menjadi 6, setelah itu angka 6 berikutnya juga dibulatkan. Namun angka enam tidak lagi melihat angka di sebelah kiri, karena angka tersebut jelas lebih dekat ke atas, alhasil 2 terakhir bertambah 1. ROUND_UNNECESSARY- digunakan untuk mengecek bahwa angka tersebut tidak perlu dibulatkan. Artinya, kami memeriksa apakah nomor tersebut memiliki jumlah tempat desimal yang diperlukan:
BigDecimal firstValue = new BigDecimal("2.55");
BigDecimal firstResult =  firstValue.setScale(2, BigDecimal.ROUND_UNNECESSARY);//2.55
Semuanya baik-baik saja di sini, nilainya memiliki dua digit dan kami memeriksa bahwa hanya ada dua digit setelah koma desimal. Tapi jika:
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UNNECESSARY);
Lalu kita mendapatkan - ArithmeticException, karena nilai yang diuji melebihi jumlah tempat desimal yang ditentukan. Tetapi jika kita memeriksa dua tempat desimal, tetapi sebenarnya ada satu di sana, maka pengecualian tidak akan dilempar, dan angka yang hilang hanya ditambah dengan nol:
BigDecimal thirdValue = new BigDecimal("2.5");
BigDecimal thirdResult = thirdValue.setScale(3, BigDecimal.ROUND_UNNECESSARY   );//2.500
Saya juga ingin mencatat bahwa y BigDecimalmemiliki konstanta yang mirip dengan konstanta BigInteger ZERO, ONEdan TEN. Berikut ini tautan ke dokumentasinya . Dan akhirnya: seperti yang mungkin Anda perhatikan, saat melakukan operasi dengan objek BigIntegerdan BigDecimal, kami tidak mengubah yang lama, tetapi selalu mendapatkan yang baru. Hal ini memberitahu kita bahwa mereka immutabletidak dapat diubah setelah diciptakan, sama seperti String. Dengan kata lain, semua metode mereka tidak dapat mengubah keadaan internal objek; paling-paling, mereka dapat mengembalikan objek baru dengan parameter yang ditentukan oleh fungsi yang kita gunakan.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION