Üzən nöqtə nömrələri (float, double) onluq dəqiqliyi tələb edən ifadələrin hesablanması zamanı istifadə olunur. Mühasibat uçotu və digər hesablama əməliyyatlarında çox vaxt yüksək dəqiqlik tələb olunur. Java-da ədədlərin yuvarlaqlaşdırılması - 1Bəs ondalıq nöqtədən sonra bizə həmişə uzun “quyruğuna” ehtiyacımız varmı? Bəlkə üç real hissənin dəqiqliyi bizə kifayətdir? Və biz bu seçimdən razıyıq, yuvarlaqlaşdırmanı necə düzgün yerinə yetirmək olar? Bu gün dəqiq danışacağımız şey budur: Java-da ədədləri yuvarlaqlaşdırmağın yollarına baxacağıq .

Sim formatı

Birinci üsul olaraq ikiqat yuvarlaqlaşdırmaya baxacağıq:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
Nəticədə, biz üzən nöqtə nömrəmizi 3 onluq dəqiqliklə formatlayacağıq , çünki formatlaşdırma təlimatlarında üç onluq yerləri "%.3f" göstərmişik. Öz növbəsində, sətri formatlaşdırarkən %f üzən nöqtənin növünü göstərir. Java-da doublefloat məlumat tipini özündə cəmləşdirən nömrələr.Yuxarıdakı nümunədə biz nəticədə olan dəyəri konsola çıxarırıq.İndi sual belədir: bunu necə qısaltmaq olar?Bu sadədir: siz öz növbəsində printf-dən istifadə etməlisiniz. format + çapdır.Nəticədə əvvəlki nümunəmiz belə azalacaq:
double value = 34.766674;
System.out.printf("%.3f",value);
Bu metoda əlavə olaraq, PrintStream sinifinin çıxış nümunəsi də oxşar şəkildə işləyən format metoduna malikdir:
double value = 34.766674;
System.out.format("%.3f",value);
Yuvarlaqlaşdırma HALF_UP rejimində baş verir - kəsilənə daha yaxın olan nömrəyə doğru (0 və ya 10-a qədər). Bu ədədlər bərabər məsafədədirsə (5 olduqda), yuvarlaqlaşdırma aparılır. Misal:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
Yuvarlaqlaşdırma rejimlərini aşağıda daha ətraflı müzakirə edəcəyik. Java-da ədədlərin yuvarlaqlaşdırılması - 2

Ondalık Format

Başqa bir seçim DecimalFormat sinifindən istifadə etməkdir . O, Java-da istənilən nömrəni, istər tam, istərsə də üzən nöqtəli nömrəni formatlamaq üçün nəzərdə tutulmuşdur. DecimalFormat-ı yaratdığımız zaman ona format sətrini ötürə bilərik. Giriş üçün neçə onluq yerin formatlanacağını göstərəcək. DecimalFormat istifadə edərək nümunəmiz belə görünür :
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
#.### sətri , ötürülən dəyəri 3 onluq yerə formatlaşdırdığımızı göstərən nümunədir. DecimalFormat obyekti yaradıldıqdan sonra nümunəni dəyişdirmək üçün onun applicationPatternapplyLocalizedPattern metodlarından istifadə edə bilərsiniz :
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
Amma bu gün biz yuvarlaqlaşdırmadan danışırıq, elə deyilmi? Göstərilən nümunədən artıq onluq yerləri olan ədədi kəsərkən, sonuncu kəsilmiş ədəd 5-dən çox olarsa, OndalıkFormat rəqəmi yuvarlaqlaşdırır. Bəs rəqəm 5 olarsa? Məlum oldu ki, o, ən yaxın tam ədədlər arasında tam ortadadır. Bəs onda? Bu zaman əvvəlki rəqəm nəzərə alınır. Əgər bərabərdirsə, yuvarlaqlaşdırma aparılır:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
Qəribədirsə, yerinə yetirilmir:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
String.format() və DecimalFormat.format() istifadə edərək üzən nöqtəli nömrələrin formatlanması arasında cüzi fərq var. Birincisi, kəsr hissəsi olmasa belə, həmişə arxadakı sıfırları çap edəcək. Məsələn:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
Gördüyümüz kimi, 7.000132 rəqəmini üç onluq yerə formatlayarkən String-in format() metodu 7.000, DecimalFormat-ın format() metodu isə 7-ni çıxaracaq. Yəni String.format() və ya OndalıkFormat formatını( ) arxadakı sıfırlara ehtiyacınız olub-olmamağınızdan asılı olaraq. Yuxarıda təsvir edilən üsullardan istifadə edərək nəticəni sətir şəklində aldıq. Tam ədədi dəyərləri geri qaytarmağın yollarına baxaq.

Riyaziyyat

Rəqəmlərlə müxtəlif arifmetik əməliyyatlar üçün hazırlanmış xüsusi sinfi - Riyaziyyatı qeyd etməmək mümkün deyil . Java-da ədədlərin yuvarlaqlaşdırılması - 3Bu sinifdə yuvarlaqlaşdırma üsulları da var, lakin artıq təsvir edilənlərdən fərqli olaraq, onlar sizə müəyyən sayda onluq yerləri təyin etməyə imkan vermir, əksinə tam ədədə yuvarlaqlaşdırmağa imkan verir:
  • Math.ceil() ən yaxın tam ədədə yuvarlaqlaşdırır, lakin tam ədəd növü deyil, ikiqat qaytarır:

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    34.0000000 olsa belə, Math.ceil istifadə etdikdən sonra yenə də 35.0 alacağıq.

    Math.floor() ən yaxın tam ədədə yuvarlaqlaşdırır və nəticəni də ikiqat qaytarır:

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    Yenə 34.999999999 dəyərimiz olsa belə, Math.floor istifadə etdikdən sonra 34.0 alacağıq.

  • Math.round () - int nəticəsini verən ən yaxın tam ədədə yuvarlaqlaşdırır:

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    Sayımız 34,5-dirsə, 35-ə yuvarlaqlaşdırılır, lakin 34,499-dan bir qədər azdırsa, rəqəm 34-ə qədər kəsilir.

    Bütün real hissəni sadəcə kəsmək deyil, bu prosesi müəyyən sayda onluq yerlərə və eyni zamanda yuvarlaqlaşdırmağa tənzimləmək üçün rəqəm 10^n-ə (n-in gücünə 10) vurulur, burada n zəruri onluq yerlərin sayına bərabərdir. Bundan sonra, yuvarlaqlaşdırmaq üçün Riyaziyyat sinfinin bəzi metodlarından istifadə olunur və sonra yenidən 10^n-ə bölünür:

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow - iki arqument götürür. Birincisi rəqəmdir, ikincisi onun yüksəldilməsi lazım olan gücdür.

BigDecimal ilə yuvarlaqlaşdırma

BigDecimal üzən nöqtəli nömrələrlə işləməyə imkan verən sinifdir. Xüsusilə, onun əsas xüsusiyyəti ondan ibarətdir ki, o, ixtiyari uzunluqdakı kəsr ədədlərini saxlaya bilir (yəni nömrənin diapazonunda heç bir məhdudiyyət yoxdur). Bundan əlavə, bu sinif yuvarlaqlaşdırma da daxil olmaqla arifmetik emal üçün müxtəlif üsulları saxlayır. Bu obyektin sinfi konstruktoru ikiqat, üzən nöqtə nömrəsini göstərmək üçün sətir, double və MathContext və s. təyin etməklə yaradıla bilər . MathContext RoundingMode və axtarılan dəyərdəki rəqəmlərin ümumi sayını təsvir edən rəqəmin birləşməsidir . Yuvarlaqlaşdırma qaydaları RoundingMode: DOWN - sıfıra doğru yuvarlaqlaşdırma. UP — sıfır rejimindən yuvarlaqlaşdırma. TAVAN - müsbət sonsuzluğa doğru yuvarlaqlaşdırma. FLOOR - mənfi sonsuzluğa doğru yuvarlaqlaşdırma. HALF_UP - Hər iki qonşu bərabər məsafədə deyilsə (yəni yuvarlaqlaşdırılan rəqəm 5 olduqda) "ən yaxın qonşuya" yuvarlanır. Bu vəziyyətdə yuvarlaqlaşdırma aparılır. HALF_DOWN - “ən yaxın qonşuya” doğru yuvarlaqlaşdırma. Hər iki qonşu bərabər məsafədə deyilsə, bu halda yuvarlaqlaşdırın. HALF_EVEN - Hər iki qonşu bərabər məsafədə deyilsə, "ən yaxın qonşuya" yuvarlanır. Bu halda, cüt qonşuya yuvarlaqlaşdırın (yuxarıda təsvir edilən OndalıkFormatda olduğu kimi). GƏRƏKSİZ - Tələb olunan əməliyyatın düzgün nəticəyə malik olduğunu təsdiqləmək üçün istifadə olunur. Buna görə yuvarlaqlaşdırma tələb olunmur. Misal:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
Konstruktorda yuvarlaqlaşdırma qaydasını təyin etmək qabiliyyətinə əlavə olaraq, BigDecimal nümunə yaradıldıqdan sonra yuvarlaqlaşdırma rejimini təyin etməyə imkan verir. Bunu etmək üçün setScale metodundan istifadə edin , onda onluq yerlərin sayını və yuvarlaqlaşdırma qaydalarını təyin etməlisiniz:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal həmçinin yuvarlaqlaşdırma rejimini təyin etmək üçün nəzərdə tutulmuş daxili int dəyişənlərinə malikdir ( ROUND_DOWN , ROUND_CEILING , ROUND_FLOOR ...) Bunlar RoundingMode sinfində təqdim olunanlara bənzər yuvarlaqlaşdırma qaydalarıdır və eyni şəkildə setScale -də istifadə olunur :
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
Bu məqalədə BigDecimal sinfi haqqında ətraflı oxuyun .