1.1 Üzlük rəqəmlərin yuvarlaqlaşdırılması
Üzlük (kəsrli) rəqəmlər ingiliscə floating point number – üzlük nöqtəli rəqəmlər adlanır: ABŞ-da rəqəmin tam və kəsrli hissəsi arasında nöqtə istifadə olunur. Buna görə də adı float buradan gəlir.
Bildiyimiz kimi, üzlük nömrəni (float) tam nömrəyə (int) çevirdikdə, həmişə aşağını yuvarlaqlaşdırır — kəsrli hissəsi sadəcə atılır. Amma elə bir vəziyyət təsəvvür etmək asandır ki, kəsrli rəqəmi ən yaxın tam ədədə və ya ümumiyyətlə yuxarıya yuvarlaqlaşdırmaq lazımdır. Nə etməli?
Bu cür hallarda JavaScript-də round() adlı daxili funksiya var. O, Math kitabxanası yaradılmadan əvvəl icad edilmişdir, buna görə də o, ora daxil deyil. Ancaq aşağı yuvarlaqlaşdırma və yuxarı yuvarlaqlaşdırma funksiyaları math kitabxanasındadır.
Math.round() funksiyası
Math.round() funksiyası rəqəmi ən yaxın tam ədədə yuvarlaqlaşdırır:
Math.round(üzlük_rəqəm)
Bu funksiya ona ötürülmüş üzlük rəqəmə ən yaxın olan tam ədədi qaytaracaq.
Nümunələr:
| Komanda | Nəticə |
|---|---|
let x = Math.round(4.1); |
4 |
let x = Math.round(4.5); |
5 |
let x = Math.round(4.9); |
5 |
Math.ceil() funksiyası
Math.ceil() funksiyası rəqəmi tam ədədə qədər yuxarı yuvarlaqlaşdırır:
| Komanda | Nəticə |
|---|---|
let x = Math.ceil(4.1); |
5 |
let x = Math.ceil(4.5); |
5 |
let x = Math.ceil(4.9); |
5 |
Math.floor() funksiyası
Math.floor() funksiyası rəqəmi tam ədədə qədər aşağı yuvarlaqlaşdırır:
| Komanda | Nəticə |
|---|---|
let x = Math.floor(4.1); |
4 |
let x = Math.floor(4.5); |
4 |
let x = Math.floor(4.9); |
4 |
Əgər bu komandaları yadda saxlamaq çətin gəlirsə, sizə kiçik ingilis dili dərsi kömək edəcək:
- math — riyaziyyat
- round — dairə/yuvarlaqlaşdırmaq
- ceiling — tavan
- floor — döşəmə
1.2 Üzən nöqtəli ədədlərin quruluşu
JavaScript-də number tipi -1.7*10308 ilə +1.7*10308 aralığında olan qiymətləri yadda saxlaya bilər. Bu qədər böyük aralığın səbəbi, number tipinin bütöv ədədlərdən fərqli bir şəkildə qurulmasıdır. number tipindəki hər dəyişən iki ədəd saxlayır: birincisi mantisa, ikincisi isə — dərəcə.
Tutaq ki, bizim 123456789 ədədimiz var və onu number tipində bir dəyişəndə saxlamışıq. O zaman bu ədəd 1.23456789*108 formasına çevrilir və number tipində iki ədəd saxlanılır — 1.23456789 və 8. Qırmızı ilə «ədədin mənalı hissəsi» (mantisa), mavi ilə isə dərəcə qeyd olunub.
Bu yanaşma həm çox böyük, həm də çox kiçik ədədləri saxlamağa imkan verir. Amma ədədin ölçüsü 8 bayt (64 bit) ilə məhdudlaşdığı üçün bir hissə dərəcənin (həmçinin ədədin işarəsi və dərəcənin işarəsinin) saxlanılmasına sərf olunur, nəticədə mantisanın maksimal uzunluğu 15 rəqəmlə məhdudlaşır.
Bu, həqiqi ədədlərin quruluşunun çox sadələşdirilmiş təsviridir: daha ətraflı məlumatı bu keçiddə tapa bilərsiniz.
1.3 Həqiqi ədədlərlə iş zamanı dəqiqlik itkisi
Həqiqi ədədlərlə işləyərkən həmişə nəzərə almaq lazımdır ki, həqiqi ədədlər — dəqiq deyil. Həmişə yuvarlaqlaşdırma xətaları, çevrilmə xətaları onluq sistemdən ikilik sistemə və nəhayət, ən çox rast gəlinən hal — dəqiqlik itkisi çox müxtəlif ölçülü ədədlərin toplanıb/çıxılması zamanı baş verir.
Sonuncu vəziyyət, proqramlaşdırmada yeni olanlar üçün ən gözlənilməzdir.
Əgər 109 ədədindən 1/109 çıxarsa, yenidən 109 alacağıq.
| Çox müxtəlif ölçülü ədədlərin çıxılması | İzah |
|---|---|
| 1000000000.000000000 - 0.000000001 1000000000.000000000 |
İkinci ədəd çox kiçikdir və onun məna kəsb edən hissəsi (boz rəngdə göstərilib) nəzərə alınmır. Qırmızı ilə 15 məna kəsb edən rəqəm göstərilib. |
Burada nə demək olar, proqramlaşdırma — riyaziyyat deyil.
1.4 Üzdəyişən ədədlərin müqayisəsində təhlükə
Üzdəyişən ədədlərin müqayisəsində proqramçılara başqa bir təhlükə də gözləyir. Bu ədədlərlə iş zamanı yuvarlama səhvləri toplana bilər ki, nəticədə elə hallar yaranar ki, üzdəyişən ədədlər bərabər olmalıdır, amma onlar bərabər deyil. Əksinə: ədədlər bərabər olmamalıdır, amma onlar bərabərdir.
Nümunə:
| Komanda | İzah |
|---|---|
let a = 1000000000.0let b = 0.000000001let c = a – b |
a dəyişəni 1000000000.0 dəyərinə malik olacaq.c dəyişəni 1000000000.0 dəyərinə malik olacaq( b dəyişənindəki ədəd çox kiçikdir). |
Yuxarıdakı nümunədə a və c bərabər olmamalıdır, amma onlar bərabərdir.
Başqa bir nümunəyə baxaq:
| Komanda | İzah |
|---|---|
let a = 1.00000000000000001let b = 1.00000000000000002 |
a dəyişəni 1.0 dəyərinə malik olacaq.b dəyişəni 1.0 dəyərinə malik olacaq. |
Təcrübədə üzdəyişən ədədlər belə müqayisə olunur:
Əgər ədədlərin fərqi (modulu üzrə) hansısa çox kiçik bir ədəddən azdırsa, onlar bərabər sayılır.
Nümunə:
let a = 0.00000000012;
let b = 0.000000000011;
if (Math.abs(a - b) < 0.00001) {
console.log("bərabərdir");
} else {
console.log("bərabər deyil");
}
GO TO FULL VERSION