CodeGym /Kurslar /JAVA 25 SELF /Ədədlərin yuvarlaqlaşdırılması və formatlaşdırılması

Ədədlərin yuvarlaqlaşdırılması və formatlaşdırılması

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

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

  1. Ədədi 100-ə vururuq (iki rəqəm lazımdırsa).
  2. Math.round ilə tam ədədə yuvarlaqlaşdırırıq.
  3. 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

  1. Lazım olan şablonla obyekt yaradırıq.
  2. 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ə
"0.00"
2 2.00
"0.00"
2.5 2.50
"0.00"
2.567 2.57
"0.###"
2.567 2.567
"0.###"
2.5 2.5
"#,##0.00"
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.7182.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
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION