1. Membundarkan nombor nyata
Seperti yang telah kita bincangkan, apabila nombor nyata diberikan kepada pembolehubah int
, ia sentiasa dibundarkan ke bawah kepada integer terkecil yang terdekat - bahagian pecahan dibuang begitu sahaja.
Tetapi adalah mudah untuk membayangkan situasi apabila nombor pecahan perlu dibundarkan kepada integer terdekat dalam mana-mana arah atau pun dibundarkan ke atas. Apa yang anda lakukan dalam kes ini?
Untuk ini dan untuk banyak situasi yang serupa, Java mempunyai kelas Math
, yang mempunyai round()
, ceil()
, dan floor()
kaedah.
Math.round()
kaedah
Kaedah Math.round()
membundarkan nombor kepada integer terdekat:
long x = Math.round(real_number)
Tetapi terdapat satu lagi nuansa di sini: kaedah ini mengembalikan long
integer (bukan int
). Oleh kerana nombor nyata boleh menjadi sangat besar, pencipta Java memutuskan untuk menggunakan jenis integer terbesar Java yang tersedia: long
.
Sehubungan itu, jika pengaturcara ingin memberikan hasil kepada int
pembolehubah, maka dia mesti menunjukkan secara jelas kepada pengkompil bahawa dia menerima kemungkinan kehilangan data (sekiranya nombor yang terhasil tidak sesuai dengan jenis int
).
int x = (int) Math.round(real_number)
Contoh:
Kenyataan | Hasilnya |
---|---|
|
|
|
|
|
|
Math.ceil()
kaedah
Kaedah Math.ceil()
membundarkan nombor kepada integer. Berikut adalah contoh:
Kenyataan | Hasilnya |
---|---|
|
|
|
|
|
|
Math.floor()
kaedah
Kaedah Math.floor()
membundarkan nombor ke bawah kepada integer. Berikut adalah contoh:
Kenyataan | Hasilnya |
---|---|
|
|
|
|
|
|
Sudah tentu, apabila membundarkan nombor ke bawah kepada integer, lebih mudah untuk menggunakan operator cast jenis:(int)
Kenyataan | Hasilnya |
---|---|
|
|
Jika anda merasa sukar untuk mengingati nama-nama ini, pelajaran bahasa Inggeris pendek akan membantu:
Math
bermaksud matematikRound
bermaksud bulatCeiling
bermaksud silingFloor
bermaksud lantai
2. Bagaimana nombor titik terapung distrukturkan
Jenis double
boleh menyimpan nilai dalam julat dari hingga . Julat besar nilai ini (berbanding dengan jenis) dijelaskan oleh fakta bahawa jenis (serta ) mempunyai struktur dalaman yang sama sekali berbeza daripada jenis integer. Secara dalaman, jenis mengekodkan nilainya sebagai dua nombor: yang pertama dipanggil mantissa , dan yang kedua dipanggil eksponen .-1.7*10308
+1.7*10308
int
double
float
double
Katakan kita mempunyai nombor 123456789
dan menyimpannya sebagai double
pembolehubah. Apabila kita melakukannya, nombor itu ditukar kepada , dan secara dalaman jenis menyimpan dua nombor — dan . Significand ("bahagian penting nombor" atau mantissa) diserlahkan dengan warna merah, manakala eksponen diserlahkan dengan warna biru.1.23456789*108
double
23456789
8
Pendekatan ini memungkinkan untuk menyimpan kedua-dua nombor yang sangat besar dan yang sangat kecil. Tetapi kerana perwakilan nombor adalah terhad kepada 8 bait (64 bit) dan beberapa bit digunakan untuk menyimpan eksponen ( serta tanda mantissa dan tanda eksponen), digit maksimum yang tersedia untuk mewakili mantissa ialah 15 .
Ini adalah penerangan yang sangat ringkas tentang cara nombor nyata distrukturkan.
3. Kehilangan ketepatan apabila bekerja dengan nombor nyata
Apabila bekerja dengan nombor nyata, sentiasa ingat bahawa nombor nyata tidak tepat . Mungkin sentiasa ada ralat pembundaran dan ralat penukaran apabila menukar daripada perpuluhan kepada binari. Selain itu, sumber ralat yang paling biasa ialah kehilangan ketepatan apabila menambah/menolak nombor pada skala yang berbeza secara radikal.
Fakta terakhir ini agak mengejutkan untuk pengaturcara baru.
Jika kita tolak daripada , kita dapat .1/109
109
109
Menolak nombor pada skala yang sangat berbeza | Penjelasan |
---|---|
|
Nombor kedua adalah sangat kecil , yang akan menyebabkan significandnya (diserlahkan dalam warna kelabu) diabaikan. 15 digit bererti diserlahkan dalam oren. |
Apa yang boleh kita katakan, pengaturcaraan tidak sama dengan matematik.
4. Perangkap apabila membandingkan nombor nyata
Bahaya lain terletak pada penantian pengaturcara apabila mereka membandingkan nombor nyata. Ia timbul apabila bekerja dengan nombor nyata, kerana ralat pusingan boleh terkumpul. Hasilnya ialah terdapat situasi apabila nombor nyata dijangka sama, tetapi tidak. Atau sebaliknya: nombor dijangka berbeza, tetapi ia adalah sama.
Contoh:
Kenyataan | Penjelasan |
---|---|
|
Nilai pembolehubah a akan menjadi 1000000000.0 Nilai pembolehubah c akan menjadi 1000000000.0 (nombor dalam b pembolehubah adalah terlalu kecil) |
Dalam contoh di atas, a
dan c
tidak sepatutnya sama, tetapi mereka adalah.
Atau mari kita ambil contoh lain:
Kenyataan | Penjelasan |
---|---|
|
Nilai pembolehubah a akan 1.0 Nilai pembolehubah b akan1.0 |
5. Fakta menarik tentangstrictfp
Java mempunyai strictfp
kata kunci khas ( strict f loating p oint ), yang tidak terdapat dalam bahasa pengaturcaraan lain. Dan adakah anda tahu mengapa anda memerlukannya? Ia memburukkan ketepatan operasi dengan nombor titik terapung. Inilah kisah bagaimana ia berlaku:
GO TO FULL VERSION