Tipe primitif | Ukuran dalam memori | Jarak nilai |
---|---|---|
byte | 8 sedikit | -128 hingga 127 |
pendek | 16 sedikit | ke -32768 hingga 32767 |
arang | 16 sedikit | dari 0 hingga 65536 |
ke dalam | 32 bit | dari -2147483648 hingga 2147483647 |
panjang | 64 bit | dari -9223372036854775808 hingga 9223372036854775807 |
mengambang | 32 bit | dari (2 pangkat -149) hingga ((2-2 pangkat -23)*2 pangkat 127) |
dobel | 64 bit | dari (-2 pangkat 63) hingga ((2 pangkat 63) - 1) |
boolean | 8 (bila digunakan dalam array), 32 (bila digunakan dalam non-array) | benar atau salah |
BigInteger
tidak BigDecimal
terbatas. Untuk apa kelas-kelas ini digunakan? Pertama-tama, untuk perhitungan dengan persyaratan akurasi yang sangat tinggi. Misalnya, ada program yang kehidupan manusianya bergantung pada keakuratan perhitungan (perangkat lunak untuk pesawat terbang dan roket atau untuk peralatan medis). Oleh karena itu, jika tempat desimal ke-150 memainkan peran penting, BigDecimal
itu adalah pilihan terbaik. Selain itu, tak jarang benda-benda tersebut digunakan dalam dunia keuangan, dimana keakuratan perhitungan hingga nilai terkecil juga sangat penting. Bagaimana cara bekerja dengan objek BigInteger
dan BigDecimal
apa yang penting untuk diingat tentangnya? Objek dari kelas-kelas ini dibuat seperti ini:
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);
}
}
Melewati string sebagai parameter hanyalah salah satu konstruktor yang mungkin. Di sini kita menggunakan string karena angka kita melebihi nilai maksimum long
dan double
, dan entah bagaimana kita perlu menjelaskan kepada compiler sebenarnya angka apa yang ingin kita dapatkan :) Lewatkan saja angka 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 tidak akan bekerja: Java akan mencoba "menyesuaikan" nomor yang diteruskan ke salah satu tipe data primitif, tetapi tidak cocok dengan salah satu tipe data tersebut. Oleh karena itu, menggunakan string untuk meneruskan nomor yang diinginkan adalah pilihan yang baik. Kedua kelas dapat secara otomatis mengekstrak nilai numerik dari string yang diteruskan. Hal penting lainnya yang perlu diingat ketika bekerja dengan kelas dalam jumlah besar adalah bahwa objeknya tidak dapat diubah ( Immutable
) . Anda sudah mengenal baik prinsip kekekalan melalui contoh kelas String
dan kelas pembungkus untuk primitif (Integer, Long, dan lain-lain).
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);
}
}
Keluaran konsol:
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
Jumlah kami tidak berubah, seperti yang Anda harapkan. Agar operasi penambahan berhasil, Anda harus membuat objek baru dan menetapkan hasil penambahan ke objek tersebut.
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);
}
}
Keluaran konsol:
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111144444444
Sekarang semuanya berfungsi sebagaimana mestinya :) Omong-omong, apakah Anda memperhatikan betapa tidak biasa tampilan operasi penambahan?
BigInteger result = integer.add(BigInteger.valueOf(33333333));
Ini adalah poin penting lainnya. Kelas dengan jumlah besar tidak menggunakan operator +-*/ dalam operasinya, melainkan menyediakan serangkaian metode. Mari kita lihat yang utama (seperti biasa, Anda dapat menemukan daftar lengkap metode dalam dokumentasi Oracle: di sini dan di sini ).
-
metode melakukan operasi aritmatika:
add()
,subtract()
,multiply()
,divide()
. Digunakan untuk operasi penjumlahan, pengurangan, perkalian dan pembagian. -
doubleValue()
,intValue()
,floatValue()
,longValue()
dll. - Digunakan untuk mengkonversi sejumlah besar ke tipe primitif Java. Berhati-hatilah saat menggunakannya dan ingat perbedaan kapasitasnya!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); } }
Keluaran konsol:
8198552921648689607
-
min()
danmax()
- memungkinkan Anda menemukan nilai minimum dan maksimum dari dua bilangan besar yang dilewati.
Harap diperhatikan: metode tidak 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)); } }
Keluaran konsol:
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
Kontrol pembulatan BigDecimal
Topik ini dimasukkan dalam bagian tersendiri, karena membulatkan bilangan besar dan menyesuaikannya bukanlah hal yang sederhana. Anda dapat mengatur jumlah tempat desimal untuk suatu angkaBigDecimal
menggunakan setScale()
. Misalnya, kita ingin menyetel presisi angka 111.5555555555 ke tiga angka desimal. Namun, kita tidak akan bisa meneruskan angka 3 sebagai argumen pada metode tersebut setScale()
dan dengan demikian menyelesaikan masalah kita. Seperti disebutkan di atas, BigDecimal
ini adalah angka untuk perhitungan dengan akurasi yang meningkat. Dalam bentuknya yang sekarang, bilangan kita memiliki 10 tempat desimal. Kita ingin membuang 7 buah dan menyisakan 3 saja. Oleh karena itu, selain angka 3, kita harus melewati mode pembulatan sebagai parameter . Ada total 8 mode pembulatan BigDecimal
. Cukup banyak! Namun jika Anda perlu benar-benar menyempurnakan keakuratan perhitungan dalam program ini, Anda akan memiliki semua yang Anda perlukan untuk ini. Nah, berikut 8 mode pembulatan yang tersedia di BigDecimal
:
-
ROUND_CEILING
- mengumpulkan111.5555555555 -> setScale(3, ROUND_CEILING) -> 111.556
-
ROUND_DOWN
- pembuangan pembuangan111.5555555555 -> setScale(3, ROUND_DOWN) -> 111.555
-
ROUND_FLOOR
- pembulatan ke bawah111.5555555555 -> setScale(3, ROUND_FLOOR) -> 111.555
-
ROUND_HALF_UP
— pembulatan ke atas jika angka setelah koma >= 0,50.55 -> setScale(1, ROUND_HALF_UP) -> 0.6 0.54 -> setScale(1, ROUND_HALF_UP) -> 0.5
-
ROUND_HALF_DOWN
— pembulatan ke atas jika angka setelah koma > 0,50.55 -> setScale(1, ROUND_HALF_DOWN) -> 0.5 0.56 -> setScale(1, ROUND_HALF_DOWN) -> 0.6
-
ROUND_HALF_EVEN
— pembulatan akan bergantung pada angka di sebelah kiri koma desimal. Jika bilangan di sebelah kiri genap, maka pembulatan dilakukan ke bawah. Jika angka di sebelah kiri koma desimal ganjil maka akan dibulatkan ke atas.2.5 -> setScale(0, ROUND_HALF_EVEN) -> 2
Angka di sebelah kiri koma desimal - 2 - adalah angka genap. Pembulatan terjadi ke bawah. Karena kita memerlukan 0 tempat desimal, hasilnya adalah 2.
3.5 -> setScale(0, ROUND_HALF_EVEN) -> 4
Angka di sebelah kiri koma desimal - 3 - ganjil. Pembulatan terjadi ke atas. Karena kita memerlukan 0 tempat desimal, hasilnya adalah 4.
-
ROUND_UNNECCESSARY
— digunakan jika mode pembulatan perlu diteruskan ke metode tertentu, namun angkanya tidak perlu dibulatkan. Jika Anda mencoba membulatkan angka ketika mode ROUND_UNNECCESSARY diatur, ArithmeticException akan muncul.3.51 -> setScale(1, ROUND_UNNECCESSARY) -> ArithmeticException
-
ROUND_UP
- mengumpulkan.111.5551 -> setScale(3, ROUND_UP) -> 111.556
Perbandingan jumlah yang besar
Pertanyaan ini juga penting. Anda pasti ingat bahwa metode ini digunakan untuk membandingkan objek di Javaequals()
. Itu disediakan oleh bahasa itu sendiri (dalam kasus kelas bawaan Java) atau diganti oleh pemrogram. Namun dalam kasus objek kelas, tidak disarankan BigDecimal
menggunakan metode ini equals()
sebagai perbandingan. Alasannya adalah BigDecimal.equals()
metode dua angka mengembalikan nilai true hanya jika kedua angka tersebut mempunyai nilai dan skala yang sama : Mari kita bandingkan perilaku metode equals()
y Double
dan 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));
}
}
Keluaran konsol:
true
false
Seperti yang Anda lihat, angka 1,5 dan 1,50 pada kasus c BigDecimal
ternyata tidak sama! Hal ini terjadi justru karena kekhususan metode equals()
di kelas tersebut BigDecimal
. Untuk perbandingan keduanya lebih tepat, BigDecimal
lebih baik menggunakan 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));
}
}
Keluaran konsol:
0
Metode ini compareTo()
mengembalikan 0 yang artinya sama dengan 1,5 dan 1,50. Inilah hasil yang kami andalkan! :) Ini menyimpulkan pelajaran kita hari ini. Saatnya kembali ke tugas! :)
GO TO FULL VERSION