CodeGym /Kurslar /JAVA 25 SELF /Kəsr ədədlərə və double

Kəsr ədədlərə və double tipinə giriş

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

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çü
float
Ədədlər ±1.5 × 10-45 ... ±3.4 × 1038 ~7 rəqəm (nöqtədən sonra) 4 bayt
double
Ə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: doubleint — 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
"%.2f"
23.57 nöqtədən sonra 2 rəqəmli ədəd
"%.1f"
23.6 nöqtədən sonra 1 rəqəmli ədəd

8. floatdouble 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 doublefloat-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.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION