JavaRush /Java блогы /Random-KK /Java тіліндегі сандарды дөңгелектеу

Java тіліндегі сандарды дөңгелектеу

Топта жарияланған
Жылжымалы нүкте сандары (float, double) ондық дәлдікті қажет ететін өрнектерді есептеу кезінде қолданылады. Бухгалтерлік және басқа есептеу операцияларында жоғары дәлдік жиі қажет. Java тіліндегі сандарды дөңгелектеу - 1Бірақ ондық бөлшектен кейін сандардың ұзын «құйрығы» әрқашан қажет пе? Мүмкін бізге үш нақты бөліктің дәлдігі жеткілікті шығар? Және бұл опция бізді қанағаттандырады, дөңгелектеуді қалай дұрыс орындау керек? Бүгін біз дәл осы туралы айтатын боламыз: Java тілінде сандарды дөңгелектеу жолдарын қарастырамыз .

Жол пішімі

Бірінші әдіс ретінде біз қосарлы дөңгелектеуді қарастырамыз:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
Нәтижесінде біз 34766674 жылжымалы нүктені 3 ондық таңба дәлдігімен пішімдейтін боламыз , өйткені пішімдеу нұсқауларында біз үш ондық таңбаны «%.3f» көрсеттік. Өз кезегінде, жолды пішімдеу кезінде %f өзгермелі нүктенің түрін көрсетеді. Java тіліндегі double және float деректер түрін қамтитын сандар.Жоғарыдағы мысалда біз алынған мәнді консольге шығарамыз.Енді сұрақ: мұны қалай қысқартуға болады?Бұл қарапайым: сізге printf пайдалану керек, ол өз кезегінде пішім + басып шығару болып табылады.Нәтижесінде алдыңғы Біздің мысал келесіге қысқарады:
double value = 34.766674;
System.out.printf("%.3f",value);
Бұл әдіске қосымша, PrintStream сыныбының шығыс данасында ұқсас жұмыс істейтін пішім әдісі де бар:
double value = 34.766674;
System.out.format("%.3f",value);
Дөңгелектеу HALF_UP режимінде - кесілгенге жақынырақ (0 немесе 10) санға қарай жүреді. Егер бұл сандар бірдей қашықтықта болса (5 болған жағдайда), онда дөңгелектеу жүргізіледі. Мысалы:
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
Дөңгелектеу режимдерін төменде толығырақ қарастырамыз. Java тіліндегі сандарды дөңгелектеу - 2

Ондық формат

Басқа нұсқа - DecimalFormat сыныбын пайдалану . Ол Java тіліндегі кез келген санды пішімдеуге арналған, ол бүтін немесе өзгермелі нүктелі сан болсын. DecimalFormat нұсқасын жасағанда , біз оны пішім жолын бере аламыз. Ол енгізу үшін қанша ондық таңбаны пішімдеу керектігін көрсетеді. DecimalFormat пайдалану арқылы біздің мысал осылай көрінеді :
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
#.### жолы - берілген мәнді 3 ондық таңбаға пішімдеп жатқанымызды көрсететін үлгі. DecimalFormat нысаны жасалғаннан кейін үлгіні өзгерту үшін оның applicationPattern және applyLocalizedPattern әдістерін пайдалануға болады :
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
Бірақ бүгін біз дөңгелектеу туралы айтып жатырмыз, солай емес пе? Көрсетілген үлгіден асатын ондық таңбалары бар санды қысқартқанда, DecimalFormat соңғы қысқартылған сан 5-тен үлкен болса, санды дөңгелектейді. Бірақ егер сан 5 болса ше? Ол ең жақын бүтін сандардың дәл ортасында орналасқаны белгілі болды. Сонда ше? Бұл жағдайда алдыңғы сан есепке алынады. Егер ол жұп болса, дөңгелектеу орындалады:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
Егер тақ болса, ол орындалмайды:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
String.format() және DecimalFormat.format() көмегімен өзгермелі нүкте сандарын пішімдеу арасында шамалы айырмашылық бар. Біріншісі бөлшек бөлігі болмаса да, әрқашан кейінгі нөлдерді басып шығарады. Мысалыға:
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
Көріп отырғанымыздай, 7.000132 санын үш ондық таңбаға пішімдеу кезінде String форматы() әдісі 7.000 шығарады, ал DecimalFormat форматы() әдісі 7 шығарады. Яғни String.format() немесе DecimalFormat. format() таңдауға болады. ) сізге кейінгі нөлдер қажет пе, жоқ па байланысты. Жоғарыда сипатталған әдістерді қолдана отырып, нәтижені жол түрінде алдық. Нақты сандық мәндерді қайтару жолдарын қарастырайық.

Математика

Сандармен әр түрлі арифметикалық операцияларға арналған арнайы сыныпты атап өту мүмкін емес - Математика . Java тіліндегі сандарды дөңгелектеу - 3Бұл сыныпта дөңгелектеу әдістері де бар, бірақ жоғарыда сипатталғандардан айырмашылығы, олар ондықтардың белгілі бір санын орнатуға мүмкіндік бермейді, керісінше бүтін санға дейін дөңгелектейді:
  • Math.ceil() ең жақын бүтін санға дейін дөңгелектейді, бірақ бүтін сан түрін емес, қосарлы мәнді қайтарады:

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

    Бізде 34.0000000 болса да, Math.ceil пайдаланғаннан кейін біз бәрібір 35.0 аламыз.

    Math.floor() ең жақын бүтін санға дейін дөңгелектейді, сонымен қатар нәтижені екі есе қайтарады:

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

    Тағы да, егер бізде 34,999999999 мәні болса да, Math.floor пайдаланғаннан кейін біз 34,0 аламыз.

  • Math.round () - int нәтижесін беретін ең жақын бүтін санға айналдырады:

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

    Егер санымыз 34,5 болса, ол 35-ке дейін дөңгелектенеді, бірақ 34,499-дан сәл аз болса, сан 34-ке қысқарады.

    Бүкіл нақты бөлікті жай ғана кесіп тастамай, бұл процесті ондық бөлшектердің белгілі бір санына дейін реттеу және бір уақытта дөңгелектеу үшін сан 10^n-ге көбейтіледі (n-дің дәрежесіне 10), мұндағы n қажетті ондық таңбалар санына тең. Осыдан кейін математика сыныбының кейбір әдісі дөңгелектеу үшін пайдаланылады, содан кейін қайтадан 10^n-ге бөлінеді:

    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 - екі аргумент қабылдайды. Біріншісі - сан, екіншісі - оны көтеру керек күш.

BigDecimal көмегімен дөңгелектеу

BigDecimal - өзгермелі нүктелі сандармен жұмыс істеуге мүмкіндік беретін класс. Атап айтқанда, оның басты ерекшелігі - ол ерікті ұзындықтағы бөлшек сандарды сақтай алады (яғни, санның диапазонында шектеу жоқ). Сонымен қатар, бұл класс арифметикалық өңдеудің әртүрлі әдістерін, соның ішінде дөңгелектеуді сақтайды. Бұл нысанның класын конструкторды double, қалқымалы нүкте санын көрсету үшін жол, double және MathContext және т.б. орнату арқылы жасауға болады. MathContext — RoundingMode және ізделетін мәндегі цифрлардың жалпы санын сипаттайтын санның тіркесімі . Дөңгелектеу ережелері RoundingMode: DOWN - нөлге қарай дөңгелектеу. UP — нөлден бастап дөңгелектеу. CEILING - оң шексіздікке қарай дөңгелектеу. FLOOR - теріс шексіздікке қарай дөңгелектеу. HALF_UP - "Ең жақын көршіге" дейін дөңгелектейді, егер екі көрші де бірдей қашықтықта болмаса (яғни дөңгелектенетін сан 5 болғанда). Бұл жағдайда дөңгелектеу орындалады. HALF_DOWN – «жақын көршіге» қарай дөңгелектеу. Егер екі көрші де бірдей қашықтықта болмаса, бұл жағдайда төмен қарай дөңгелектеңіз. ЖАРТЫ_ЖҮП – егер екі көрші де бірдей қашықтықта болмаса, «ең жақын көршіге» айналдырады. Бұл жағдайда жұп көршіге дейін дөңгелектеңіз (жоғарыда сипатталған DecimalFormat файлындағыдай). NENEESSARY - сұралған операцияның дұрыс нәтижесі бар екенін растау үшін пайдаланылады. Сондықтан дөңгелектеу қажет емес. Мысалы:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
Конструкторда дөңгелектеу ережесін орнату мүмкіндігінен басқа, BigDecimal дананы жасағаннан кейін дөңгелектеу режимін орнатуға мүмкіндік береді. Ол үшін setScale әдісін пайдаланыңыз , онда ондық таңбалардың санын және дөңгелектеу ережелерін орнату қажет:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal жүйесінде дөңгелектеу режимін орнатуға арналған ішкі int айнымалылары бар ( ROUND_DOWN , ROUND_CEILING , ROUND_FLOOR ...) Бұл RoundingMode сыныбында ұсынылғанға ұқсас дөңгелектеу ережелері және setScale ішінде бірдей пайдаланылады :
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
BigDecimal класы туралы толығырақ осы мақалада оқыңыз .
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION