JavaRush /Java blogi /Random-UZ /Java-da raqamlarni yaxlitlash

Java-da raqamlarni yaxlitlash

Guruhda nashr etilgan
Suzuvchi nuqtali raqamlar (float, double) kasr aniqligini talab qiladigan ifodalarni hisoblashda ishlatiladi. Buxgalteriya hisobi va boshqa hisoblash operatsiyalarida yuqori aniqlik ko'pincha talab qilinadi. Java-da raqamlarni yaxlitlash - 1Lekin biz har doim o'nlik nuqtadan keyin raqamlarning uzun "dumi" kerakmi? Ehtimol, biz uchun uchta haqiqiy qismning aniqligi etarlidir? Va biz bu variantdan mamnunmiz, yaxlitlashni qanday qilib to'g'ri bajarish kerak? Aynan shu narsa bugun biz gaplashamiz: Java-da raqamlarni yaxlitlash usullarini ko'rib chiqamiz .

String formati

Birinchi usul sifatida biz dublni yaxlitlashni ko'rib chiqamiz:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
Natijada, biz 34766674 suzuvchi nuqtani 3 kasr aniqligi bilan formatlaymiz , chunki formatlash bo'yicha ko'rsatmalarda biz uchta kasrli "%.3f"ni ko'rsatdik. O'z navbatida, satrni formatlashda %f suzuvchi nuqta turini ko'rsatadi. raqamlar, Java-da double va float ma'lumotlar turini o'z ichiga oladi.Yuqoridagi misolda biz olingan qiymatni konsolga chiqaramiz.Endi savol: buni qanday qisqartirishimiz mumkin?Bu oddiy: siz o'z navbatida printf dan foydalanishingiz kerak. Bu format + chop etish. Natijada, oldingi misolimiz quyidagicha qisqartiriladi:
double value = 34.766674;
System.out.printf("%.3f",value);
Ushbu usulga qo'shimcha ravishda, PrintStream sinfining chiqish nusxasi ham shunga o'xshash ishlaydigan formatlash usuliga ega:
double value = 34.766674;
System.out.format("%.3f",value);
Yaxlitlash HALF_UP rejimida amalga oshiriladi - kesilgan raqamga yaqinroq bo'lgan raqamga (0 yoki 10 gacha). Agar bu raqamlar teng masofada bo'lsa (5 bo'lsa), u holda yaxlitlash amalga oshiriladi. Misol:
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
Yaxlitlash rejimlarini quyida batafsilroq muhokama qilamiz. Java-da raqamlarni yaxlitlash - 2

Decimal Format

Yana bir variant DecimalFormat sinfidan foydalanishdir . U Java-da istalgan raqamni, xoh u butun son yoki suzuvchi nuqtali raqamni formatlash uchun mo'ljallangan. DecimalFormat-ni yaratganimizda , biz uni formatlash satriga o'tkazishimiz mumkin. U kiritish uchun qancha o'nlik kasr formatlash kerakligini ko'rsatadi. DecimalFormat yordamida bizning misolimiz shunday ko'rinadi :
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
#.### qatori o'tkazilgan qiymatni 3 kasrga formatlashimizni ko'rsatadigan naqshdir. DecimalFormat ob'ekti yaratilgandan keyin naqshni o'zgartirish uchun uning applyPattern va applyLocalizedPattern usullaridan foydalanishingiz mumkin :
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
Ammo bugun biz yaxlitlash haqida gapiramiz, shunday emasmi? O'nlik kasrlari belgilangan naqshdan ortiq bo'lgan raqamni qisqartirganda, DecimalFormat oxirgi kesilgan raqam 5 dan katta bo'lsa, sonni yaxlitlaydi. Lekin raqam 5 bo'lsa-chi? Ma'lum bo'lishicha, u eng yaqin butun sonlar orasida aynan o'rtada joylashgan. Keyin nima? Bunday holda, oldingi raqam hisobga olinadi. Agar u teng bo'lsa, yaxlitlash amalga oshiriladi:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
Agar g'alati bo'lsa, u bajarilmaydi:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
String.format() va DecimalFormat.format() yordamida suzuvchi nuqtali raqamlarni formatlash oʻrtasida biroz farq bor. Birinchisi, kasr qismi bo'lmasa ham, har doim keyingi nollarni chop etadi. Masalan:
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
Ko‘rib turganimizdek, 7.000132 sonini uchta kasrga formatlashda String format() usuli 7000, DecimalFormat format() usuli esa 7. Ya’ni String.format() yoki DecimalFormat format() ni tanlash mumkin. ) sizga keyingi nol kerak yoki kerak emasligiga qarab. Yuqorida tavsiflangan usullardan foydalanib, biz natijani satr shaklida oldik. Keling, aniq raqamli qiymatlarni qaytarish yo'llarini ko'rib chiqaylik.

Matematika

Raqamlar bilan turli xil arifmetik operatsiyalar uchun mo'ljallangan maxsus sinfni eslatib o'tmaslik mumkin emas - Matematik . Java-da raqamlarni yaxlitlash - 3Ushbu sinfda yaxlitlash usullari ham mavjud, ammo yuqorida tavsiflanganlardan farqli o'laroq, ular ma'lum sonli kasrlarni belgilashga imkon bermaydi, balki butun songa yaxlitlash imkonini beradi:
  • Math.ceil() eng yaqin butun songa yaxlitlaydi, lekin butun son turini emas, balki ikki barobarni qaytaradi:

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

    Agar bizda 34.0000000 bo'lsa ham, Math.ceil-dan foydalangandan keyin biz hali ham 35.0 ni olamiz.

    Math.floor() eng yaqin butun songa yaxlitlaydi va natijani ikki barobarga qaytaradi:

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

    Shunga qaramay, bizda 34,999999999 qiymati bo'lsa ham, Math.floor- dan foydalangandan so'ng biz 34,0 ni olamiz.

  • Math.round () - int natijasini beradigan eng yaqin butun songa aylantiradi:

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

    Agar bizning raqamimiz 34,5 bo'lsa, u 35 ga yaxlitlanadi, lekin 34,499 dan bir oz kamroq bo'lsa, raqam 34 ga qisqartiriladi.

    Butun haqiqiy qismni shunchaki kesib tashlamaslik, balki bu jarayonni ma'lum miqdordagi o'nli kasrlar soniga va bir vaqtning o'zida yumaloqlash uchun tartibga solish uchun raqam 10 ^ n ga (10 n kuchiga) ko'paytiriladi, bu erda n zarur kasrlar soniga teng. Shundan so'ng, matematika sinfining ba'zi usullari yaxlitlash uchun ishlatiladi va keyin yana 10 ^ n ga bo'linadi:

    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 - ikkita argumentni oladi. Birinchisi - raqam, ikkinchisi - uni ko'tarish kerak bo'lgan kuch.

BigDecimal bilan yaxlitlash

BigDecimal - bu suzuvchi nuqtali raqamlar bilan ishlash imkonini beruvchi sinf. Xususan, uning asosiy xususiyati shundaki, u ixtiyoriy uzunlikdagi kasr raqamlarini saqlashi mumkin (ya'ni raqam diapazonida hech qanday cheklov yo'q). Bundan tashqari, bu sinf arifmetik ishlov berishning turli usullarini, shu jumladan yaxlitlashni saqlaydi. Ushbu ob'ektning sinfi konstruktorni double, suzuvchi nuqta raqamini ko'rsatish uchun string, double va MathContext va hokazolarni sozlash orqali yaratilishi mumkin. MathContext - bu RoundingMode va qidirilayotgan qiymatdagi raqamlarning umumiy sonini tavsiflovchi raqamning kombinatsiyasi . Yaxlitlash qoidalari RoundingMode: DOWN - nolga yaxlitlash. UP - nol rejimidan yaxlitlash. CEILING - ijobiy cheksizlik tomon yaxlitlash. FLOOR - salbiy cheksizlik tomon yaxlitlash. HALF_UP - Agar ikkala qo'shni ham bir xil masofada bo'lmasa (ya'ni, yaxlitlanayotgan raqam 5 bo'lsa) "eng yaqin qo'shni" ga o'tadi. Bunday holda, yaxlitlash amalga oshiriladi. HALF_DOWN - "yaqin qo'shni" tomon yaxlitlash. Ikkala qo'shni ham bir xil masofada bo'lmasa, bu holda pastga aylantiring. HALF_EVEN - Agar ikkala qo'shni ham bir xil masofada bo'lmasa, "eng yaqin qo'shni" ga o'tadi. Bunday holda, juft qo'shniga aylantiring (yuqorida tasvirlangan DecimalFormatda bo'lgani kabi). NECESSARY - so'ralgan operatsiya to'g'ri natijaga ega ekanligini tasdiqlash uchun ishlatiladi. Shuning uchun, yaxlitlash talab qilinmaydi. Misol:
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 yaxlitlash qoidasini o'rnatish imkoniyatidan tashqari, BigDecimal misol yaratilgandan keyin yaxlitlash rejimini o'rnatishga imkon beradi. Buni amalga oshirish uchun setScale usulidan foydalaning , unda siz kasrlar sonini va yaxlitlash qoidalarini belgilashingiz kerak:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal shuningdek, yaxlitlash rejimini o'rnatish uchun mo'ljallangan ichki int o'zgaruvchilarga ega ( ROUND_DOWN , ROUND_CEILING , ROUND_FLOOR ...) Bular RoundingMode sinfida taqdim etilganlarga o'xshash yaxlitlash qoidalari va xuddi shu tarzda setScale da qo'llaniladi :
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
Ushbu maqolada BigDecimal sinfi haqida ko'proq o'qing .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION