1. Bunder angka nyata

Nalika kita wis rembugan, nalika nomer nyata diutus kanggo intvariabel, iku tansah dibunderaké mudhun kanggo integer cilik paling cedhak - bagean pecahan mung dibuwak.

Nanging gampang kanggo mbayangno kahanan nalika nomer pecahan kudu dibunderaké menyang integer paling cedhak ing salah siji arah utawa malah dibunderaké munggah. Apa sing sampeyan tindakake ing kasus iki?

Kanggo iki lan akeh kahanan sing padha, Jawa nduweni Mathkelas, sing nduweni round(), ceil(), lan floor()metode.


Math.round()cara

Cara iki Math.round()mbunderake nomer menyang integer paling cedhak:

long x = Math.round(real_number)

Nanging ana nuansa liyane ing kene: cara iki ngasilake longinteger (dudu int). Amarga nomer nyata bisa dadi gedhe banget, pangripta Jawa mutusake nggunakake jinis integer paling gedhe sing kasedhiya ing Jawa: long.

Dadi, yen programmer pengin nemtokake asil menyang intvariabel, mula dheweke kudu kanthi tegas nuduhake menyang kompiler yen dheweke nampa kemungkinan mundhut data (yen nomer asil ora cocog karo jinis int).

int x = (int) Math.round(real_number)

Tuladha:

Pratelan asil
int x = (int) Math.round(4.1);
4
int x = (int) Math.round(4.5);
5
int x = (int) Math.round(4.9);
5

Math.ceil()cara

Cara iki Math.ceil()mbunderake nomer nganti integer. Ing ngisor iki contone:

Pratelan asil
int x = (int) Math.ceil(4.1);
5
int x = (int) Math.ceil(4.5);
5
int x = (int) Math.ceil(4.9);
5

Math.floor()cara

Cara iki Math.floor()ngubengi nomer nganti integer. Ing ngisor iki contone:

Pratelan asil
int x = (int) Math.floor(4.1);
4
int x = (int) Math.floor(4.5);
4
int x = (int) Math.floor(4.9);
4

Mesthi, nalika dibunderaké nomer mudhun kanggo integer, iku luwih gampang kanggo mung nggunakake jinis operator cast:(int)

Pratelan asil
int x = (int) 4.9
4

Yen sampeyan angel ngelingi jeneng kasebut, pelajaran basa Inggris sing cendhak bakal mbantu:

  • Mathtegese matematika
  • Roundtegese bunder
  • Ceilingtegese langit-langit
  • Floortegese lantai

2. Carane angka floating-titik wis kabentuk

Jinis kasebut doublebisa nyimpen nilai ing kisaran saka nganti . Iki sawetara ageng saka nilai (dibandhingake karo jinis) diterangake dening kasunyatan sing jinis (uga ) wis struktur internal temen beda saka jinis integer. Sacara internal, jinis kasebut nyandi nilai kasebut dadi rong angka: sing pisanan diarani mantissa , lan sing nomer loro diarani eksponen .-1.7*10308+1.7*10308intdoublefloatdouble

Ayo kita duwe nomer 123456789lan nyimpen variabel double. Nalika kita nindakake, nomer diowahi kanggo , lan njero jinis nyimpen rong nomer - lan . Significand ("bagean penting saka nomer" utawa mantissa) disorot abang, dene eksponen disorot biru.1.23456789*108double234567898

Pendekatan iki ngidini sampeyan nyimpen nomer sing gedhe banget lan sing cilik banget. Nanging amarga perwakilan nomer diwatesi nganti 8 bita (64 bit) lan sawetara bit digunakake kanggo nyimpen eksponen ( uga tandha mantissa lan tandha eksponen), angka maksimal sing kasedhiya kanggo makili mantissa . punika 15 .

Iki minangka gambaran sing disederhanakake babagan carane nomer nyata disusun.


3. Mundhut presisi nalika nggarap nomer nyata

Nalika nggarap angka nyata, tansah elinga yen angka nyata ora persis . Bisa uga ana kesalahan pembulatan lan kesalahan konversi nalika ngowahi saka desimal menyang binar. Kajaba iku, sumber kesalahan sing paling umum yaiku mundhut presisi nalika nambah / nyuda nomer ing skala sing beda banget.

Kasunyatan pungkasan iki rada nggumunake kanggo programer pemula.

Yen kita nyuda saka , kita entuk .1/109109109

Ngurangi angka ing skala sing beda banget Panjelasan
 1000000000.000000000;
-         0.000000001;
 1000000000.000000000;
Nomer kaloro cilik banget , sing bakal nyebabake significand (disorot warna abu-abu) ora digatekake. 15 digit penting disorot ing oranye.

Apa sing bisa kita ucapake, pemrograman ora padha karo matematika.


4. Pitfall nalika mbandhingaké nomer nyata

Liyane bebaya dumunung ing Enteni kanggo programer nalika padha mbandhingaké nomer nyata. Iku muncul nalika nggarap nomer nyata, amarga kesalahan babak bisa nglumpukake. Asil iku ana kahanan nalika nomer nyata samesthine padha, nanging ora. Utawa kosok balene: angka-angka sing dikarepake beda, nanging padha.

Tuladha:

Pratelan Panjelasan
double a = 1000000000.0;
double b = 0.000000001;
double c = a - b;
Nilai saka variabel a bakal 1000000000.0
Nilai saka variabel c bakal 1000000000.0
(nomer ing b variabel cilik banget)

Ing conto ing ndhuwur, alan ckudu ora padha, nanging padha.

Utawa ayo njupuk conto liyane:

Pratelan Panjelasan
double a = 1.00000000000000001;
double b = 1.00000000000000002;
Nilai saka variabel a bakal 1.0
Nilai saka variabel b bakal1.0

5. Kasunyatan menarik babaganstrictfp

Jawa nduweni strictfptembung kunci khusus ( strict f loating p oint ), sing ora ditemokake ing basa pamrograman liyane. Lan sampeyan ngerti kenapa sampeyan butuh? Iku worsens akurasi operasi karo nomer floating-titik. Mangkene critane kedadeyan kasebut:

Pangripta Jawa:
Kita pancene pengin Jawa dadi super populer lan mbukak program Jawa ing akeh piranti sabisa. Dadi, kita nggawe manawa spesifikasi mesin Java ujar manawa kabeh program kudu mlaku kanthi cara sing padha ing kabeh jinis piranti!
Produsen prosesor Intel:
Hey kabeh! Kita wis nambah prosesor, lan saiki kabeh nomer nyata diwakili nggunakake 10-byte tinimbang 8-byte ing prosesor kita. Luwih byte tegese digit sing luwih penting. Apa tegese? Bener! Saiki petungan ilmiah sampeyan bakal luwih akurat!
Ilmuwan lan kabeh wong sing melu petungan ultra-tepat:
Kelangan! Inggih rampung. Kabar apik banget!
Pangripta Jawa:
Ora-ora-ora, kowe! Kita wis ngandhani yen kabeh program Java kudu mlaku ing kabeh piranti . Kita bakal mateni kemampuan kanggo nggunakake nomer nyata 10-bait ing prosesor Intel.
Saiki kabeh apik maneh! Aja matur nuwun.
Ilmuwan lan kabeh wong sing melu petungan ultra-tepat:
Apa sampeyan wis edan kabeh? Cepet bali kabeh kaya sing wis ana!
Pangripta Jawa:
Wong lanang, iki kanggo kabecikanmu! Bayangake: kabeh program Java mlaku kanthi cara sing padha ing kabeh piranti . Apik banget!
Ilmuwan lan kabeh wong sing melu petungan ultra-tepat:
Ora. Ora kelangan babar pisan. Cepet sijine kabeh bali carane iku! Utawa ngerti ngendi kita bakal sijine Jawa Panjenengan?
Pangripta Jawa:
Hmm. Kok ora langsung ngomong ngono? Mesthi, kita bakal sijine maneh.
Kita mulihake kemampuan sampeyan kanggo nggunakake kabeh fitur prosesor paling anyar.
Miturut cara ... Kita uga khusus nambah strictfptembung kunci kanggo basa. Yen sampeyan nulis sadurunge jeneng fungsi, kabeh operasi sing nglibatake nomer nyata ing fungsi kasebut bakal dadi ala ing kabeh piranti !