boolean
dan char
, variabel tersebut dibagi menjadi beberapa jenis berikut:
- bilangan bulat:
byte
,short
,int
danlong
; - floating point (juga disebut bilangan real):
float
dandouble
.
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 BigInteger
dan BigDecimal
.
Bilangan Bulat Besar di Jawa
Kelas JavaBigInteger
digunakan 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
, Double
dan 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 BigInteger
dengan 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 BigInteger
dengan nilai masing-masing, 0
, 1
dan 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
-
operasi dengan perhitungan mod :
BigInteger firstValue = new BigInteger("-34"); BigInteger secondValue = new BigInteger("5"); BigInteger resultValue = firstValue.mod(secondValue); //1
-
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
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
, BigDecimal
merupakan turunan dari suatu kelas Number
dan 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 konstruktornyaBigDecimal
, karena kelasnya memiliki pilihan yang lebih luas. Ada konstruktor yang memungkinkan Anda menyetel nilai suatu objek dengan cara berbeda (dengan meneruskan int
, long
, double
, String
dan 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 iniBigDecimal
juga berisi metode untuk berbagai operasi aritmatika, tetapi BigInteger
tidak memiliki metode untuk bekerja dengan bit, seperti . Namun demikian, fitur utamanya BigDecimal
adalah 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
BigDecimal
dengan yang lainBigDecimal
, 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 dalamnyaBigDecimal
kita 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 BigDecimal
memiliki konstanta yang mirip dengan konstanta BigInteger ZERO
, ONE
dan TEN
. Berikut ini tautan ke dokumentasinya . Dan akhirnya: seperti yang mungkin Anda perhatikan, saat melakukan operasi dengan objek BigInteger
dan BigDecimal
, kami tidak mengubah yang lama, tetapi selalu mendapatkan yang baru. Hal ini memberitahu kita bahwa mereka immutable
tidak 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.
GO TO FULL VERSION