1. Kəsr ədədlər
Tutaq ki, siz ən sadə kalkulyator yazmaq qərarına gəldiniz. Və ya hesablamaların lazım olduğu istənilən başqa proqram (sadə pul hesabından tutmuş mürəkkəb fizikaya qədər). Reallıqda hər şey — tam ədəd deyil və bunun qarşısını almaq olmur!
Elə isə yeni bir məlumat tipi ilə silahlanaq!
Proqramlaşdırmada kəsr ədədlərə həm də real ədədlər və ya üzən nöqtəli ədədlər (floating-point) deyilir. Java-da, əksər dillərdə olduğu kimi, onlar təkcə tam ədədləri deyil, həm də “kəsr” qiymətləri saxlamaq üçündür: müxtəlif 3.14, -28.57, 2.718281828...
Real (üzən nöqtəli) ədədlərin iki əsas tipi var:
| Tip | Nə saxlayır | Dəyər diapazonu (təxmini) | Dəqiqlik | Tipik ölçü |
|---|---|---|---|---|
|
Ədədlər | ±1.5 × 10-45 ... ±3.4 × 1038 | ~7 rəqəm (nöqtədən sonra) | 4 bayt |
|
Ədədlər | ±5.0 × 10-324 ... ±1.7 × 10308 | ~15–16 rəqəm (nöqtədən sonra) | 8 bayt |
Tip float
float tipi adını floating-point number — üzən nöqtəli ədəd anlayışından alıb. Real ədədlər — riyaziyyatdakı ədədlərdir, onların müəyyən xassələri var. Kompüterin isə çoxlu məhdudiyyətləri var. Buna görə də Java-da kəsr ədədləri real adlandırmaq tam düzgün deyil. Onlar üçün “üzən nöqtəli ədədlər” ifadəsi istifadə olunur.
float tipi adətən 7 əhəmiyyətli rəqəmi (məsələn, 0.1234567), onluğun qüvvətini saxlayır və yaddaşda 4 bayt tutur. Dəqiq hesablamalar üçün bu çox azdır, ona görə də hamı tez bir zamanda ikiqat dəqiqliyə keçdi.
Tip double
double tipi adını ikiqat (double) dəqiqlikdən alıb. O, yaddaşda 8 bayt tutur (float-dan 2 dəfə çoxdur) və 15 əhəmiyyətli rəqəmə qədər saxlaya bilir: 0.123456789012345. Bu, kəsr ədədlərlə çoxluqla aparılan hesablamalar üçün tam kifayətdir, buna görə də double Java-da kəsr ədədləri saxlamaq üçün əsas tipdir.
Bu mühazirədə əsas diqqət double tipində olacaq: o, susmaya görə bütün “adi” kəsr ədədlər üçün tövsiyə olunur. Amma sonra float tipinə də baxacağıq.
2. double tipli dəyişənlərin elan edilməsi və ilkləndirilməsi
Hər şey int kimidir — yalnız indi double istifadə edirik.
// Dəyişən elan edirik və ona Pi dəyərini mənimsədirik
double pi = 3.1415926;
// İlkləndirmədən də elan etmək olar
double averageSalary;
averageSalary = 91234.56;
// Hesablamaq olar!
double pizzaPieces = 8;
double friends = 3;
double piecesPerFriend = pizzaPieces / friends; // 2.666... (2 deyil)
Sintaksisin xüsusiyyətləri:
- Onluq ayırıcısı kimi nöqtə (3.14) istifadə olunur. Vergül istifadə etsəniz — kompilyasiya xətası alacaqsınız!
- Dəqiq desək, double d = 3; yazsanız, xəta almayacaqsınız — tiplər avtomatik çevriləcək (tam ədəd itkisiz şəkildə “üzən nöqtəli”yə çevrilir).
3. Scanner ilə kəsr ədədlərin daxil edilməsi və çıxarılması
Əvvəlcə kəsr ədədi ekrana çıxaraq:
double amount = 42.75;
System.out.println(amount); // Çap edəcək: 42.75
Hər şey yaxşıdır! Bəs mətn əlavə etsək:
System.out.println("Hesabınızda: " + amount + " avro."); // Hesabınızda: 42.75 avro.
Klaviaturadan daxil etmə
double daxil etmək üçün Scanner sinfinin xüsusi metodundan istifadə etmək lazımdır: console.nextDouble().
Scanner console = new Scanner(System.in);
System.out.println("Çöldəki temperaturu daxil edin:");
double temperature = console.nextDouble(); // Dərhal double daxil edirik
System.out.println("İndi çöldə: " + temperature + " dərəcə.");
4. double işdə: arifmetika
Bütün adi əməliyyatlar (+, -, *, /) int üçün olduğu kimi işləyir:
double distance = 100.5;
double time = 2.0;
double speed = distance / time; // 50.25
System.out.println("Orta sürət: " + speed); // Orta sürət: 50.25
Arifmetika bu qədər. Yeganə fərq: bölmənin nəticəsi — operandlardan ən azı biri double olduqda həmişə kəsr ədəd olur.
int ilə müqayisə edək
int a = 5, b = 2;
System.out.println(a / b); // 2 (qalıq atılır)
double aa = 5, bb = 2;
System.out.println(aa / bb); // 2.5
5. double ilə işləyərkən tipik səhvlər və qəribəliklər
Girişin çevrilməsi xətası
Klassik vəziyyət: istifadəçi 3,14 daxil edir — proqram isə 3.14 gözləyir. Java-da Scanner.nextDouble() metodu cari lokala əsaslanır: rus/alman lokalında vergül keçərlidir, ingilis lokalında isə nöqtə tələb olunur. Zərurət varsa, Scanner üçün lokalı qurun və ya sətiri oxuyub əl ilə parse edin.
// Bu, Locale.US üçün problem yaradacaq, əgər “3,14” daxil edilsə
double value = console.nextDouble();
Ədədlərin “dəqiqlik” problemi
Burada yeni başlayanlar adətən bir qədər çaşqınlıq yaşayır:
double x = 0.1 + 0.2;
System.out.println(x); // Hm... 0.30000000000000004
Təbriklər, siz kompüterdə kəsr ədədlərin təqdimatının “sehr”i ilə qarşılaşdınız. Məsələ ondadır ki, bir çox ədədləri ikilik sistemində dəqiq təqdim etmək mümkün deyil. Bu, adətən əksər tətbiqlər üçün kritik deyil, amma maliyyə və dəqiq elmlərdə nüanslar var.
6. Vacibdir: double və int — avtomatik və açıq çevrilmə
Bəzən siz tam və kəsr ədədləri toplayırsınız və ya int-i double dəyişəninə mənimsədirsiniz — xəta olmayacaq:
int i = 2;
double d = i; // Hər şey qaydasındadır!
System.out.println(d); // 2
double dd = 3.7;
int ii = (int) dd; // double tipini int tipinə açıq şəkildə çevirmək lazımdır!
System.out.println(ii); // 3, onluq hissə atıldı
Bu tez-tez təəccüb doğurur — niyə çevirmədən sonra onluq hissə yoxa çıxdı? Sadəcə ona görə ki, int tipi kəsrləri saxlamağı bacarmır (nöqtədən sonrakı hər şey həmişəlik itir).
double-dan int-ə çevrilmə və (int) operatoru haqqında daha ətraflı növbəti mühazirədə.
7. Formatlaşdırılmış çıxış: double dəyərlərini səliqəli göstərmək
Tez-tez susmaya görə double bir sıra lazımsız sıfırlarla çıxır. Çıxışı formatlaya bilərsiniz:
double temp = 23.56789;
System.out.println(temp); // 23.56789
// Nöqtədən sonra 2 rəqəm
System.out.println(String.format("%.2f", temp)); // 23.57
// Nöqtədən sonra 1 rəqəm
System.out.println(String.format("%.1f%n", temp)); // 23.6
| Format | Nəticə | Təsvir |
|---|---|---|
|
23.57 | nöqtədən sonra 2 rəqəmli ədəd |
|
23.6 | nöqtədən sonra 1 rəqəmli ədəd |
8. float və double ilə işləyərkən tipik səhvlər
Səhv №1: double-ın float-a gizli çevrilməsi
float f = 1.23; // Xəta!
Kompilyator narazı qalacaq: “Sən double-ı float-a yerləşdirməyə çalışırsan — bu dəqiqliyin itirilməsinə səbəb ola bilər!” Həmişə f suffiksini əlavə et.
Səhv №2: iki int-in bölünməsinin nəticəsinin int olması
int a = 7, b = 2;
double result = a / b; // 3.0, 3.5 deyil
Kəsr hissə almaq üçün operandlardan ən azı birini açıq şəkildə çevir:
double result = (double) a / b; // 3.5
Səhv №3: kəsr ədədlərin müqayisəsi
Kəsr ədədləri == ilə bərabərliyə görə müqayisə etmə. Kiçik dözümlü (epsilon) müqayisədən istifadə et.
Səhv №4: float-da dəqiqliyin itirilməsi
Böyük ədədləri və ya çox dəqiq qiymətləri float-da saxlamayın — onlar “pozula” və ya mühüm rəqəmləri itirə bilər.
GO TO FULL VERSION