1. Giriş
Həyatda nadir hallarda vergüldən sonra uzun «quyruqları» görməyə ehtiyac olur. Məsələn, malın qiymətini, maaşı, orta balı və ya otağın sahəsini hesablayarkən — adətən vergüldən sonra bir neçə rəqəm kifayətdir, 15 deyil.
Məsələn, bölmə nəticəsi:
double x = 10.0 / 3.0;
System.out.println(x); // 3.3333333333333335
İstifadəçi belə nəticəni görəndə qorxa və proqramın dəli olduğunu zənn edə bilər. Buna görə ədədləri tez-tez yuvarlaqlaşdırmaq lazımdır — ən yaxın tam ədədə, vergüldən sonra iki rəqəmə və s.
Java-da bunun üçün bir neçə əlverişli alət var.
2. Math.round() metodu: ən yaxın tam ədədə yuvarlaqlaşdırma
Ən sadə yol — Math.round() metodundan istifadə etməkdir. O, nöqtəli ədəd (həm float, həm də double) qəbul edir və ən yaxın tam ədəd qaytarır.
Math.round necə işləyir
- Əgər kəsr hissə 0.5-dən kiçikdirsə — aşağı yuvarlaqlaşdırır.
- Əgər kəsr hissə 0.5-ə bərabərdirsə və ya böyükdürsə — yuxarı yuvarlaqlaşdırır.
Nümunələr:
System.out.println(Math.round(2.3)); // 2
System.out.println(Math.round(2.7)); // 3
System.out.println(Math.round(2.5)); // 3
System.out.println(Math.round(-2.5)); // -2
Qayıdan dəyərin tipi
- Əgər float ötürsəniz, int qaytarır.
- Əgər double ötürsəniz, long qaytarır.
float f = 5.8f;
int roundedF = Math.round(f); // 6
double d = 5.8;
long roundedD = Math.round(d); // 6
Diqqət: bəzən bu təəccüb yaradır — double-u yuvarlaqlaşdırırsınız, amma nəticə long olur! Sizə int lazımdırsa, açıq cast etmək lazım olacaq:
int rounded = (int) Math.round(5.6); // 6
3. Vergüldən sonrakı lazım olan sayda rəqəmə yuvarlaqlaşdırma
Çox vaxt tam ədədə yox, məsələn, vergüldən sonra iki rəqəmə (pul, faiz və s.) yuvarlaqlaşdırmaq lazım olur.
Java-da Math.roundTo2Digits()-ə bənzər «möcüzəli» metod yoxdur, amma bunu əllə etmək olar.
Yol 1: vurma və bölmə ilə riyazi fənd
- Ədədi 100-ə vururuq (iki rəqəm lazımdırsa).
- Math.round ilə tam ədədə yuvarlaqlaşdırırıq.
- Geri 100-ə bölürük.
Nümunə:
double value = 3.14159;
double rounded = Math.round(value * 100.0) / 100.0;
System.out.println(rounded); // 3.14
Bu necə işləyir:
- 3.14159 * 100 = 314.159
- Math.round(314.159) = 314
- 314 / 100.0 = 3.14
4. Ədədlərin formatlaşdırılması: DecimalFormat sinfi
Bəzən ədədi yalnız yuvarlaqlaşdırmaq yox, həm də onu səliqəli göstərmək lazımdır — vergüldən sonra müəyyən sayda rəqəmlə, başdakı sıfırlarla, minlik ayırıcıları ilə və s. Bunun üçün Java-da java.text paketindən DecimalFormat sinfi var.
DecimalFormat necə işləyir
- Lazım olan şablonla obyekt yaradırıq.
- Onun format(...) metodunu çağırırıq.
import java.text.DecimalFormat;
double value = 3.14159;
DecimalFormat df = new DecimalFormat("0.00");
System.out.println(df.format(value)); // 3.14
Şablon necə işləyir
- "0.00" — həmişə vergüldən sonra iki rəqəm (hətta ədəd tam olsa belə).
- "0.###" — üçə qədər onluq rəqəm, artıq sıfırlar göstərilmir.
- "#,##0.00" — minlik ayırıcıları əlavə edir (məsələn, "1,234.56").
Müxtəlif şablon nümunələri:
| Şablon | Ədəd | Nəticə |
|---|---|---|
|
2 | 2.00 |
|
2.5 | 2.50 |
|
2.567 | 2.57 |
|
2.567 | 2.567 |
|
2.5 | 2.5 |
|
12345.678 | 12,345.68 |
Minlik ayırıcıları ilə nümunə
DecimalFormat df = new DecimalFormat("#,##0.00");
System.out.println(df.format(1234567.89)); // 1,234,567.89
Nümunə: artıq sıfırlar olmadan çıxış
DecimalFormat df = new DecimalFormat("0.##");
System.out.println(df.format(3.1)); // 3.1
System.out.println(df.format(3.141)); // 3.14
System.out.println(df.format(3.145)); // 3.15
5. String.format ilə formatlaşdırma
Bəzən sadə hallarda String.format-dan istifadə etmək rahatdır — sətirləri formatlaşdırmağın daxili üsulu, digər dillərdəki printf-ə bənzər.
double value = 3.14159;
System.out.println(String.format("%.2f", value)); // 3.14
Burada "%.2f" — «ədədi vergüldən sonra iki rəqəmlə göstər» deməkdir.
Yanaşmaların müqayisəsi:
- DecimalFormat — daha güclüdür, şablonları və lokallaşdırmanı dəstəkləyir, minlik ayırıcıları üçün uyğundur.
- String.format — sadəcə vergüldən sonrakı rəqəm sayını təyin etmək lazım olanda daha sadədir.
6. Yuvarlaqlaşdırmanın xüsusiyyətləri: Math.floor, Math.ceil, Math.rint
- Math.floor(x) — aşağı yuvarlaqlaşdırır (kiçik tərəfə), mənfi ədədlər üçün də.
- Math.ceil(x) — yuxarı yuvarlaqlaşdırır (böyük tərəfə).
- Math.rint(x) — ən yaxın tam ədədə yuvarlaqlaşdırır, amma double qaytarır.
Nümunələr:
System.out.println(Math.floor(2.7)); // 2.0
System.out.println(Math.ceil(2.1)); // 3.0
System.out.println(Math.rint(2.5)); // 2.0 (bəli-bəli, yazı səhvi deyil!)
System.out.println(Math.rint(3.5)); // 4.0
Diqqət: Math.rint bəzən «ən yaxın cüt ədədə» yuvarlaqlaşdırır — bu qayda (t.s. banker's rounding) çoxsaylı hesablamalarda səhvlərin yığılmasını azaltmağa kömək edir.
7. Faydalı nüanslar
Vizualizasiya: yuvarlaqlaşdırma cədvəli
| Ədəd | Math.round | Math.floor | Math.ceil | Math.rint |
|---|---|---|---|---|
| 2.3 | 2 | 2.0 | 3.0 | 2.0 |
| 2.5 | 3 | 2.0 | 3.0 | 2.0 |
| 3.5 | 4 | 3.0 | 4.0 | 4.0 |
| -2.3 | -2 | -3.0 | -2.0 | -2.0 |
| -2.5 | -2 | -3.0 | -2.0 | -2.0 |
Yuvarlaqlaşdırma — formatlaşdırma deyil!
Yuvarlaqlaşdırma ilə formatlaşdırma arasındakı fərqi başa düşmək çox vacibdir.
- Yuvarlaqlaşdırma — ədədin dəyərini dəyişdirmək (məsələn, 2.718 → 2.72).
- Formatlaşdırma — çıxış zamanı görünüşü dəyişdirmək (məsələn, 2.718 → "2.72" ekranda, amma yaddaşda 2.718 qalır).
double x = 2.718;
System.out.println(String.format("%.2f", x)); // 2.72
System.out.println(x); // 2.718
Əgər yuvarlaqlaşdırılmış ədədi sonrakı hesablamalarda istifadə etmək istəyirsinizsə — onu riyazi cəhətdən yuvarlaqlaşdırın! Yalnız çıxış üçünsə — formatlaşdırın.
8. Ədədləri yuvarlaqlaşdırma və formatlaşdırmada tipik səhvlər
Səhv №1: Yalnız çıxış üçün yuvarlaqlaşdırılıb, sonrakı hesablamalarda isə «uzun quyruqlu» ədəd istifadə olunur.
Çox yayğın vəziyyət — ekrana səliqəli formatda dəyər çıxarmaq, sonra isə hesablamalarda ilkin «uzun» ədəddən istifadə etmək. Pul, ballar və yekunlar üçün — əvvəlcə yuvarlaqlaşdırın (məsələn, Math.round və ya vurma/bölmə üsulu), sonra saxlayın/istifadəçiyə göndərin.
Səhv №2: Math.round(x)-in double olaraq vergüldən sonra iki rəqəm qaytaracağını gözləmək.
Math.round() həmişə ən yaxın tam ədədə yuvarlaqlaşdırır: float üçün int, double üçün isə long. İki rəqəm üçün vurma/bölmə və ya formatlaşdırmadan istifadə edin.
Səhv №3: DecimalFormat-dan hesablamalar üçün istifadə.
DecimalFormat.format() sətir qaytarır. Onu arifmetikada istifadə etmək olmaz: ya kompilasiya xətası alacaqsınız, ya da geri çevrilmə zamanı NumberFormatException.
Səhv №4: DecimalFormat üçün səhv şablon.
Şablon gözləntilərə uyğun olmalıdır: "0.00" həmişə iki rəqəm göstərəcək ("2.00"), "0.##" isə artıq sıfırları siləcək ("2", "2.1", "2.12").
Səhv №5: 100-ə bölərkən dəqiqliyin itirilməsi.
Əgər int-i int-ə bölsəniz, nəticə də int olacaq!
int a = 5;
System.out.println(a / 2); // 2 (2.5 deyil!)
Bölmə «ondalıq» olsun deyə, operandlardan ən azı biri double olmalıdır:
int a = 5;
System.out.println(a / 2.0); // 2.5
GO TO FULL VERSION