JavaRush /Блоги Java /Random-TG /Яклухткунии рақамҳо дар Java

Яклухткунии рақамҳо дар Java

Дар гурӯҳ нашр шудааст
Рақамҳои нуқтаҳои шинокунанда (флоат, дукарата) ҳангоми ҳисоб кардани ифодаҳое истифода мешаванд, ки дақиқии даҳиро талаб мекунанд. Дар бахисобгирии бухгалтерй ва дигар амалиёти хисоббарорй аксар вакт дакикии баланд лозим аст. Рақамҳои яклухт дар Java - 1Аммо оё ба мо ҳамеша "думи" дарози рақамҳо пас аз нуқтаи даҳӣ лозим аст? Шояд барои мо як дақиқии се қисми воқеӣ кофӣ бошад? Ва мо бо ин хосият қаноатмандем, ки чӣ тавр яклухткуниро дуруст иҷро кунем? Ин маҳз ҳамон чизест, ки мо имрӯз дар бораи он сӯҳбат хоҳем кард: мо роҳҳои гирдоварӣ кардани рақамҳоро дар Java дида мебароем .

Формати сатр

Ҳамчун усули аввал, мо яклухткунии дукаратаро дида мебароем:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
Дар натиҷа, мо рақами нуқтаи шинокунандаи худ 34766674-ро бо дақиқии 3 адад даҳӣ формат мекунем , зеро дар дастури форматкунӣ мо се адади даҳиро "%.3f нишон додем. Дар навбати худ, %f ҳангоми формат кардани сатр навъи нуқтаи шинокунандаро нишон медиҳад. рақамҳо, ки навъи додаҳои double ва float-ро дар Java дар бар мегирад.Дар мисоли дар боло овардашуда, мо арзиши натиҷаро ба консол мебарорем.Акнун савол ин аст: чӣ тавр мо метавонем инро кӯтоҳ кунем?Ин оддӣ аст: шумо бояд 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 адад даҳӣ формат карда истодаем. Барои тағир додани намуна пас аз сохтани an objectи 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 format() 7.000 мебарорад, дар ҳоле ки усули DecimalFormat формат () 7 мебарорад. Яъне шумо метавонед формати String.format() ё DecimalFormat.-ро интихоб кунед() ) вобаста ба он, ки ба шумо сифрҳои пасипар лозим аст ё не. Бо истифода аз усулҳои дар боло тавсифшуда, мо натиҷаро дар шакли сатр гирифтем. Биёед роҳҳои баргардонидани маҳз арзишҳои рақамиро бубинем.

Математика

Дар бораи синфи махсусе, ки барои амалҳои гуногуни арифметикӣ бо рақамҳо пешбинӣ шудааст, зикр накардан ғайриимкон аст - Math . Рақамҳои яклухт дар 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 (10 ба дараҷаи n) зарб карда мешавад, ки дар он 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 синфест, ки ба шумо имкон медиҳад, ки бо рақамҳои нуқтаи шинокунанда кор кунед. Аз ҷумла, хусусияти асосии он дар он аст, ки вай рақамҳои касри дарозии ихтиёриро нигоҳ дошта метавонад (яъне дар диапазони адад маҳдудият вуҷуд надорад). Илова бар ин, ин синф усулҳои гуногуни коркарди арифметикӣ, аз ҷумла яклухткуниро нигоҳ медорад. Синфи ин an objectро тавассути гузоштани конструктор ба дукарата, сатр барои намоиши рақами нуқтаи шинокунанда, double ва MathContext ва ғайра эҷод кардан мумкин аст. MathContext маҷмӯи RoundingMode ва рақамест, ки шумораи умумии рақамҳоро дар арзиши ҷустуҷӯшаванда тавсиф мекунад. Қоидаҳои яклухткунӣ RoundingMode: DOWN - яклухткунӣ ба сӯи сифр. UP — яклухткунӣ аз ҳолати сифр. ШИФТ - яклухткунӣ ба сӯи беохири мусбат. FLOOR - яклухткунӣ ба сӯи беохири манфӣ. HALF_UP - Ба "ҳамсояи наздиктарин" давр мезанад, агар ҳарду ҳамсоя дар масофаи якхела набошанд (яъне вақте ки рақами мудавваршуда 5 аст). Дар ин ҳолат, яклухткунӣ анҷом дода мешавад. HALF_DOWN - яклухткунӣ ба сӯи "ҳамсояи наздиктарин". Агар ҳарду ҳамсоя дар масофаи якхела набошанд, дар ин ҳолат ба поён мубаддал кунед. HALF_EVEN - Давра ба "ҳамсояи наздиктарин" агар ҳарду ҳамсоя дар масофаи баробар набошад. Дар ин ҳолат, ба ҳамсояи ҷуфт мудаввар кунед (чунон ки дар DecimalFormat дар боло тавсиф шудааст). НАЗУРАТ - Барои тасдиқи он, ки амалиёти дархостшуда натиҷаи дуруст дорад, истифода мешавад. Аз ин рӯ, яклухткунӣ талаб карда намешавад. Мисол:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
Илова ба қобorяти муқаррар кардани қоидаи яклухткунӣ дар созанда, BigDecimal ба шумо имкон медиҳад, ки режими яклухткуниро пас аз сохтани инстансия муқаррар кунед. Барои ин, усули setScale -ро истифода баред , ки дар он шумо бояд шумораи ҷойҳои даҳӣ ва қоидаҳои яклухтро муқаррар кунед:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal инчунин дорои тағирёбандаҳои дохorи 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