JavaRush /Java Blog /Random-ID /Desimal Besar di Jawa

Desimal Besar di Jawa

Dipublikasikan di grup Random-ID
Halo! Pada kuliah hari ini kita akan membahas tentang bilangan besar. Tidak, tentang yang SANGAT BESAR. Sebelumnya , kita telah melihat tabel rentang nilai untuk tipe data primitif lebih dari satu kali. Ini terlihat seperti ini:
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
Jika kita berbicara tentang bilangan bulat, tipe data yang paling luas adalah long , dan ketika kita berbicara tentang bilangan floating point, double . Namun bagaimana jika jumlah yang kita perlukan terlalu banyak bahkan tidak muat dalam jangka waktu lama ? Kisaran nilai Long yang mungkin cukup besar, namun masih terbatas pada ukuran tertentu - 64 bit. Apa yang dapat kita hasilkan jika Angka Sangat Besar kita berbobot 100 bit? Untungnya, Anda tidak perlu menciptakan apa pun. Di Java, dua kelas khusus dibuat untuk kasus seperti itu - BigInteger (untuk bilangan bulat) dan BigDecimal (untuk bilangan floating-point). Apa fitur mereka? Pertama-tama, secara teoritis mereka tidak memiliki ukuran maksimum. Secara teoritis, karena tidak ada komputer dengan memori tak terbatas. Dan jika Anda membuat angka di program yang lebih besar dari ukuran memori komputer, tentu saja program tersebut tidak akan berfungsi. Namun kasus seperti itu kecil kemungkinannya terjadi. Oleh karena itu, kita dapat mengatakan bahwa ukuran angka praktis BigIntegertidak BigDecimalterbatas. 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, BigDecimalitu 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 BigIntegerdan BigDecimalapa 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 longdan 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 Stringdan 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 ).
  1. metode melakukan operasi aritmatika: add() , subtract(), multiply(), divide(). Digunakan untuk operasi penjumlahan, pengurangan, perkalian dan pembagian.

  2. 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
  3. min()dan max()- 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 angka BigDecimalmenggunakan 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, BigDecimalini 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:
  1. ROUND_CEILING- mengumpulkan

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

    111.5555555555 -> setScale(3, ROUND_DOWN) -> 111.555
  3. ROUND_FLOOR- pembulatan ke bawah

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

  4. ROUND_HALF_UP— pembulatan ke atas jika angka setelah koma >= 0,5

    0.55 -> setScale(1, ROUND_HALF_UP) -> 0.6
    0.54 -> setScale(1, ROUND_HALF_UP) -> 0.5
  5. ROUND_HALF_DOWN— pembulatan ke atas jika angka setelah koma > 0,5

    0.55 -> setScale(1, ROUND_HALF_DOWN) -> 0.5
    0.56 -> setScale(1, ROUND_HALF_DOWN) -> 0.6
  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.

  7. 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
  8. 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 Java equals(). Itu disediakan oleh bahasa itu sendiri (dalam kasus kelas bawaan Java) atau diganti oleh pemrogram. Namun dalam kasus objek kelas, tidak disarankan BigDecimalmenggunakan 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 Doubledan 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 BigDecimalternyata tidak sama! Hal ini terjadi justru karena kekhususan metode equals()di kelas tersebut BigDecimal. Untuk perbandingan keduanya lebih tepat, BigDecimallebih 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! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION