1. Pembulatan bilangan real
Seperti yang telah kita diskusikan, ketika bilangan real ditugaskan ke variabel int
, itu selalu dibulatkan ke bilangan bulat terdekat yang lebih kecil - bagian pecahan dibuang begitu saja.
Tetapi mudah untuk membayangkan situasi ketika bilangan pecahan perlu dibulatkan ke bilangan bulat terdekat di salah satu arah atau bahkan dibulatkan. Apa yang Anda lakukan dalam kasus ini?
Untuk ini dan untuk banyak situasi serupa, Java memiliki kelas Math
, yang memiliki metode round()
, ceil()
, dan floor()
.
Math.round()
metode
Metode ini Math.round()
membulatkan angka ke bilangan bulat terdekat:
long x = Math.round(real_number)
Tapi ada nuansa lain di sini: metode ini mengembalikan long
bilangan bulat (bukan int
). Karena bilangan real bisa sangat besar, pembuat Java memutuskan untuk menggunakan tipe bilangan bulat terbesar yang tersedia di Java: long
.
Oleh karena itu, jika seorang programmer ingin menetapkan hasil ke suatu int
variabel, maka dia harus secara eksplisit menunjukkan kepada kompiler bahwa dia menerima kemungkinan hilangnya data (jika angka yang dihasilkan tidak sesuai dengan suatu int
tipe).
int x = (int) Math.round(real_number)
Contoh:
Penyataan | Hasil |
---|---|
|
|
|
|
|
|
Math.ceil()
metode
Metode ini Math.ceil()
membulatkan angka ke atas menjadi bilangan bulat. Berikut ini contohnya:
Penyataan | Hasil |
---|---|
|
|
|
|
|
|
Math.floor()
metode
Metode ini Math.floor()
membulatkan angka ke bawah menjadi bilangan bulat. Berikut ini contohnya:
Penyataan | Hasil |
---|---|
|
|
|
|
|
|
Tentu saja, saat membulatkan angka ke bilangan bulat, lebih mudah menggunakan operator tipe cast:(int)
Penyataan | Hasil |
---|---|
|
|
Jika Anda kesulitan mengingat nama-nama ini, pelajaran bahasa Inggris singkat akan membantu:
Math
berarti matematikaRound
berarti bulatCeiling
artinya plafonFloor
berarti lantai
2. Bagaimana struktur bilangan floating-point
Jenis double
dapat menyimpan nilai dalam rentang dari hingga . Kisaran nilai yang sangat besar ini (dibandingkan dengan tipe) dijelaskan oleh fakta bahwa tipe (serta ) memiliki struktur internal yang sama sekali berbeda dari tipe bilangan bulat. Secara internal, tipe mengkodekan nilainya sebagai dua angka: yang pertama disebut mantissa , dan yang kedua disebut eksponen .-1.7*10308
+1.7*10308
int
double
float
double
Katakanlah kita memiliki nomor 123456789
dan menyimpannya sebagai double
variabel. Saat kita melakukannya, angkanya diubah menjadi , dan secara internal tipe menyimpan dua angka — dan . Significand ("bagian penting dari angka" atau mantissa) disorot dengan warna merah, sedangkan eksponen disorot dengan warna biru.1.23456789*108
double
23456789
8
Pendekatan ini memungkinkan untuk menyimpan jumlah yang sangat besar dan sangat kecil. Tetapi karena representasi angka dibatasi hingga 8 byte (64 bit) dan beberapa bit digunakan untuk menyimpan eksponen ( serta tanda mantissa dan tanda eksponen), digit maksimum yang tersedia untuk mewakili mantissa adalah 15 .
Ini adalah deskripsi yang sangat disederhanakan tentang bagaimana bilangan real disusun.
3. Kehilangan presisi saat bekerja dengan bilangan real
Saat bekerja dengan bilangan real, ingatlah selalu bahwa bilangan real tidak eksak . Mungkin selalu ada kesalahan pembulatan dan kesalahan konversi saat mengubah dari desimal ke biner. Selain itu, sumber kesalahan yang paling umum adalah hilangnya presisi saat menambahkan/mengurangi angka pada skala yang sangat berbeda.
Fakta terakhir ini sedikit mencengangkan bagi pemrogram pemula.
Jika kita kurangi dari , Kita dapatkan .1/109
109
109
Mengurangkan angka pada skala yang sangat berbeda | Penjelasan |
---|---|
|
Angka kedua sangat kecil , yang akan menyebabkan signifikansinya (disorot dengan warna abu-abu) diabaikan. 15 digit signifikan disorot dalam warna oranye. |
Apa yang bisa kita katakan, pemrograman tidak sama dengan matematika.
4. Jebakan saat membandingkan bilangan real
Bahaya lain terletak pada menunggu programmer ketika mereka membandingkan bilangan real. Itu muncul saat bekerja dengan bilangan real, karena kesalahan pembulatan dapat terakumulasi. Hasilnya adalah ada situasi ketika bilangan real diharapkan sama, tetapi ternyata tidak. Atau sebaliknya: angkanya diharapkan berbeda, tetapi sama.
Contoh:
Penyataan | Penjelasan |
---|---|
|
Nilai variabel a akan menjadi 1000000000.0 Nilai variabel c akan menjadi 1000000000.0 (jumlah dalam b variabel terlalu kecil) |
Dalam contoh di atas, a
and c
seharusnya tidak sama, tetapi memang demikian.
Atau mari kita ambil contoh lain:
Penyataan | Penjelasan |
---|---|
|
Nilai variabel a akan menjadi 1.0 Nilai variabel b akan menjadi1.0 |
5. Fakta menarik tentangstrictfp
Java memiliki kata kunci khusus (strict floating pointstrictfp
) , yang tidak ditemukan dalam bahasa pemrograman lain . Dan tahukah Anda mengapa Anda membutuhkannya? Itu memperburuk keakuratan operasi dengan angka floating-point. Inilah kisah tentang bagaimana hal itu terjadi:
GO TO FULL VERSION