1. Vergüllü ədədlərin yuvarlanması
Artıq danışmışdıq ki, int
tipli dəyişənin içinə vergüllü ədəd yazanda onun tam hissəsi saxlanılır, qalan hissə isə sadəcə atılır.
Amma elə hallar ola bilər ki, vergüllü ədədi sadəcə ən yaxın tam ədədə və ya ümumiyyətlə yuxarı yuvarlamaq lazım gəlsin. Bu halda nə etməli?
Bu və bu kimi bir çox hallarda Java-da Math
sinfi yerləşir və onun round()
, ceil()
, floor()
adlanan metodları var.
Math.round()
metodu
Math.round()
metodu ədədi ən yaxın tam ədədə yuvarlayır:
long x = Math.round(vergullu_eded)
Amma, necə deyərlər, bir nüans var: bu metodun nəticəsinin tipi — long
(yəni int
deyil). Vergüllü ədədlər çox böyük ola bilərlər deyə, Java yaradıcıları bu işlər üçün Java-da olan ən böyük tam ədəd tipini seçib — long
.
Buna görə də nəticəni int
tipli dəyişənə yazmaq üçün proqramçı kompilyatora açıq şəkildə bildirməlidir ki, məlumatların bir qisminin itməsi ehtimalını qəbul edir (əgər ədəd int
tipinə uyğun olmazsa).
int x = (int) Math.round(vergullu_eded)
Nümunələr:
Əmr | Nəticə |
---|---|
|
|
|
|
|
|
Math.ceil()
metodu
Math.ceil()
metodu ədədi ən yaxın tam ədədə yuxarı yuvarlayır, nümunələr:
Əmr | Nəticə |
---|---|
|
|
|
|
|
|
Math.floor()
metodu
Math.floor()
metodu ədədi ən yaxın tam ədədə aşağı yuvarlayır, nümunələr:
Əmr | Nəticə |
---|---|
|
|
|
|
|
|
Hətta, bir ədədi ən yaxın tam ədədə aşağı yuvarlamaq üçün sadəcə tip çevirmə operatorundan istifadə etmək daha sadə olar — (int)
:
Əmr | Nəticə |
---|---|
|
|
Əgər bu əmrləri yadda saxlamaq çətindirsə, sizə kiçik bir ingilis dili dərsi kömək edər:
Math
— riyaziyyatRound
— dairə/yuvarlamaqCeiling
— tavanFloor
— yer
2. Üzən nöqtəli ədədlərin quruluşu
double
tipi -1.7*10308
ilə +1.7*10308
diapazonunda olan dəyərləri saxlanıla bilər. Bu cür böyük diapazon (müqayisədə int
tipi ilə) onunla izah olunur ki, double
tipi (float
kimi) tam tiplərdən fərqli olaraq tamamilə başqa cür təşkil olunub. Hər bir double
tipindəki dəyişən iki ədəd saxlayır: birinciyə mantissa, ikincisinə isə dərəcə deyilir.
Tutaq ki, bizdə 123456789
sayı var və biz onu double
tipindəki dəyişəndə saxlayırıq. O zaman bu ədəd belə bir formata çevriləcək: 1.23456789*108
və double
tipində iki ədəd saxlanacaq — 23456789
və 8
. Qırmızı ilə «ədədin əhəmiyyətli hissəsi» (mantissa), mavi ilə dərəcə vurğulanıb.
Bu yanaşma həm çox böyük, həm də çox kiçik ədədləri saxlamağa imkan verir. Amma, çünki ədədin ölçüsü 8 bayt (64 bit) ilə məhdudlaşır və bəzi bitlər dərəcənin (eləcə də ədədin işarəsi və dərəcənin işarəsi) saxlanılması üçün istifadə olunur, maksimum mantissanın uzunluğu 15 rəqəm ilə məhdudlaşır.
Bu, həqiqi ədədlərin quruluşunun çox sadələşdirilmiş təsviridir, daha tam məlumatı bu linkdə tapa bilərsiz.
3. Vergüllü ədədlərlə işləyərkən dəqiqlik itkisi
Vergüllü ədədlərlə işləyərkən həmişə yadda saxlamaq lazımdır ki, vergüllü ədədlər dəqiq deyil. Həmişə yuvarlaqlaşdırma xətaları, onluq sistemdən ikilik sistemə çevirmə xətaları və nəhayət, ən çox rast gəlinən vəziyyət – dəqiqlik itkisi fərqli böyüklüklərə malik ədədləri toplama/çıxma əməliyyatlarında olur.
Sonuncu vəziyyət proqramlaşdırmaya yeni başlayanlar üçün ən gözlənilməzdir.
Əgər ədəddən 109
1/109
çıxsaq, yenidən 109
alırıq.
Çox fərqli böyüklüklərə malik ədədlərin çıxılması | İzah |
---|---|
|
İkinci ədəd çox kiçikdir və onun irəli gələn hissəsi (boz rənglə işarələnib) nəzərə alınmır. Narıncı ilə 15 irəli gələn rəqəm işarələnib. |
Nə deyək, proqramlaşdırma – riyaziyyat deyil.
4. Həqiqi rəqəmlərin müqayisəsinin təhlükəsi
Həqiqi rəqəmlərin müqayisəsi zamanı proqramçılar başqa bir təhlükə ilə qarşılaşa bilərlər. Çünki bu rəqəmlərlə işləyərkən yuvarlaqlaşdırma səhvləri yığıla bilər və vəziyyət yaranar ki, həqiqi rəqəmlər bərabər olmalı, amma bərabər olmazlar. Və əksinə: rəqəmlər bərabər olmamalı, amma bərabər olarlar.
Nümunə:
Komanda | İzah |
---|---|
|
a dəyişənində dəyər 1000000000.0 olacaqc dəyişənində dəyər 1000000000.0 olacaq( b dəyişənindəki rəqəm çox kiçikdir) |
Yuxarıdakı nümunədə a
və c
bərabər olmamalı idi, amma onlar bərabərdir.
Başqa bir nümunəyə baxaq:
Komanda | İzah |
---|---|
|
a dəyişənində dəyər 1.0 olacaqb dəyişənində dəyər 1.0 olacaq |
5. strictfp
haqqında maraqlı fakt
Java-da xüsusi bir açar söz strictfp
(strict floating point) var ki, digər proqramlaşdırma dillərində yoxdur. Bilirsiniz, bu nə üçün lazımdır? O, həqiqi rəqəmlərlə işləyərkən dəqiqliyi pisləşdirir. Bunun ortaya çıxma hekayəsi təxminən belədir:
GO TO FULL VERSION