JavaRush /Java блогу /Random-KY /BigInteger жана BigDecimal

BigInteger жана BigDecimal

Группада жарыяланган
Java тorнде тиркеме класстардан, ал эми класстар методдордон жана өзгөрмөлөрдөн турат. Өзгөрмөлөр, өз кезегинде, примитивдүү жана шилтеме болуп бөлүнөт. BigInteger жана BigDecimal - 1Javaда өзгөрмөлөрдүн 8 түрү бар жана жана жанадан тышкары boolean, charалар төмөнкү түрлөргө бөлүнөт:
  • бүтүн сандар: byte, short, intжана long;
  • калкыма чекит (реалдуу сандар деп да аталат): floatжана double.
Бул чакан топтордун ичинде айырмачылыктар камтылышы мүмкүн болгон маанилердин диапазонунда гана бар (жана, демек, мындай өзгөрмөнүн ээлеген мейкиндиги өзгөрүп турат). Бүтүн сан түрлөрүнүн эң чоңу long-9223372036854775808ден 9223372036854775807ге чейинки диапазону менен. Калкыма чекиттердин ичинен double1,7e-308ден 1,7e+308ге чейинки диапазон менен. Чыныгы сандар тууралуу кененирээк бул макаладан окуй аласыз . Бирок алгылыктуу диапазондон чоңураак сандарды сактоо керек болсочу? Бул учурда, бизге керек болот BigIntegerжана BigDecimal.

Javaдагы BigInteger

Java классы BigInteger64 биттик узундукка ээ болбогон ыктыярдуу узундуктагы бүтүн сандардын аналогу катары колдонулат. Мындан тышкары, бул класстын тукуму Number, сандык жөнөкөй типтер үчүн стандарттык орогучтар сыяктуу - Integer, Long, Byte, Doubleж.б.
BigInteger value = new BigInteger("32145");

int intValue = value.intValue();//32145

long longValue = value.longValue();//32145

double doubleValue = value.doubleValue();//32145.0
Ошол замат биз мындай an objectтин түзүлүшү BigIntegerменен биздин маани конструкторго өтүп жатканын көрөбүз, бирок сап форматында. Анын бир эмес, бир нече дизайнер бар экенин белгилей кетүү керек, бирок бардык учурларда. Эгерде примитивдүү типтер маалыматтын толук көлөмүн камтыбаса BigInteger, маалыматтар ошол примитивдүү түрдүн диапазонуна кыскартылат. Бирок, ошол эле учурда, бул ыкмалардын аналогдору бар ( intValueExact()ж.б. longValueExact()), бир гана айырмасы, эгерде конвертация жүрүп жаткан жөнөкөй тип маалымат диапазонуна туура келбесе, ArithmeticException ыргытылат .

BigInteger константалары

Ички колдонуу үчүн класстын константалары бар:
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
Булар , тиешелүүлүгүнө жараша , BigIntegerбаалуулуктары бар туруктуу an objectилер жана . 0110

BigInteger методдору

Бул класстын негизги өзгөчөлүктөрүнүн бири Java тorнде стандарттык арифметикалык амалдарды ишке ашыруучу методдорго толгондугунда. Мисалы:
  • жыйынтыктоочу операциялар:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.add(secondValue);//73461
  • көбөйтүү амалдары:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.multiply(secondValue);//1347530670
  • бир санды экинчи санга бөлүүдө калдыкты табуу амалдары:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.remainder(secondValue);//2529
  • сандын абсолюттук маанисин алуу (башкача айтканда, модулдук, кол коюлбаган):

    BigInteger firstValue = new BigInteger("-37995");
    BigInteger resultValue =  firstValue.abs();//37995
Ошондой эле татаал (конкреттүү) операциялар үчүн ыкмалар бар:
  • режимди эсептөө менен операциялар :

    BigInteger firstValue = new BigInteger("-34");
    BigInteger secondValue = new BigInteger("5");
    BigInteger resultValue = firstValue.mod(secondValue); //1
Бул функциянын бир нече түрдүү вариациялары бар:
  • кокус санды алуу жана натыйжадагы маани колдоно турган биттердин санын көрсөтүү:

    BigInteger firstValue = BigInteger.probablePrime(8, new Random());//211
    BigInteger secondValue = BigInteger.probablePrime(16, new Random());//42571
  • биттик жылышуу операциялары (бул >> n)

    Солго жылдыруу:

    BigInteger firstValue = new BigInteger("5");
    BigInteger firstResultValue = firstValue.shiftLeft(3);//40

    Оңго жылдыруу:

    BigInteger secondValue = new BigInteger("34");
    BigInteger secondResultValue = secondValue.shiftRight(2); //8
Албетте, documentтердин толук тизмесин карап жакшы . BigInteger жана BigDecimal - 2

Javaдагы BigDecimal

Бизге ыктыярдуу узундуктун реалдуу саны керек болгондо, Java классы колдонулат - BigDecimal. Эреже катары, анын ордуна каржы менен иштөө үчүн колдонулат double, анткени ал көбүрөөк ыңгайлаштыруу параметрлерин берет. Like and BigInteger, BigDecimalкласстын тукуму Numberжана белгилүү бир примитивдик тип катары an objectтин маанисин кайтарган методдорго ээ:
BigDecimal value = new BigDecimal(35563.3);

long longValue = value.longValue();//35563

double doubleValue = value.doubleValue();//35563.3
Көрүнүп тургандай long, ге кыскартууда бүтүн сан гана бөлүгү калат, ал эми ондук орундар жокко чыгарылат.

BigDecimal конструкторлору

Биз конструкторлорду кененирээк карап чыгабыз BigDecimal, анткени класста алардын тандоосу кеңири. Объекттин маанисин ар кандай жолдор менен коюуга мүмкүндүк берүүчү конструкторлор бар ( int, long, double, Stringжана жуп деп өтүү менен BigInteger) жана ага уруксат бергендер бар. түзүлгөн an objectтин орнотууларын коюу (тегеректөө ыкмалары, ондук орундардын саны):
BigDecimal firstValue = new BigDecimal("455656.545");//455656.545
Бул жерде баары түшүнүктүү, биз көргүбүз келген ондук бөлүктөрдүн маанисин жана санын түз койдук.
BigDecimal secondValue = new BigDecimal(3445.54);//3445.5399999999999636202119290828704833984375
Бул конструктордун натыйжалары өтө күтүүсүз болушу мүмкүн, анткени биз кошту көрсөтүп жатабыз, ал өзүнүн табияты боюнча өтө эки ача түр. Ошондуктан, көбүнчө конструктордо колдонуу сунушталат String.
BigDecimal thirdValue = new BigDecimal(3445.554645675444, MathContext.DECIMAL32);//3445.555
Биз койдук double, бирок ошол эле учурда тегеректөө эрежесин сүрөттөгөн параметрди да койдук (анда ондук орундардын санын жана тегеректөө алгоритмин камтыйт).
char[] arr = new String("455656.545").toCharArray();

BigDecimal fourthValue = new BigDecimal(arr, 2, 6);//5656.5
Объекттин маанилерин кайсы элементтен алабыз жана бул элементтердин канчасын алабыз.
BigDecimal fifthValue = new BigDecimal(new BigInteger("44554"), 3);//44.554
Биз мурунтан эле бар an objectти алып BigInteger, ондук орундардын санын белгилейбиз.

BigDecimal методдору

Класста BigDecimalар кандай арифметикалык амалдар үчүн методдор да бар, бирок BigIntegerанын бит менен иштөө ыкмалары жок, мисалы. Бирок, ошентсе да, негизги өзгөчөлүгү BigDecimalкалкыма чекиттер менен иштөөдө ийкемдүүлүк болуп саналат. Келгиле, чыныгы сандарды өздөштүрүү үчүн бизге күч берген кээ бир ыкмаларды карап көрөлү:
  • биз тактыкты алабыз (сандардын саны):

    BigDecimal value = new BigDecimal("454334.34334");
    int result = value.precision();//11
  • ондук орундардын санын жана тегеректөө эрежесин коюу:

    BigDecimal firstValue = new BigDecimal(3445.544445);
    
    BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_CEILING);//3445.545

    Төмөндө биз тегеректөө эрежелерин орнотуу үчүн константаларды кененирээк карап чыгабыз.

  • ондуктардын керектүү санын жана тегеректөө эрежесин көрсөтүү менен BigDecimalбашкага бөлүңүз :BigDecimal

    BigDecimal firstValue = new BigDecimal("455656.545");
    
    BigDecimal secondValue = new BigDecimal(3445.544445);
    
    BigDecimal result = firstValue.divide(secondValue, 2,RoundingMode.DOWN);//132.24
  • ондук чекитти белгилүү сандагы орундарга оңго/солго жылдыруу:

    BigDecimal value = new BigDecimal("455656.545");
    BigDecimal firstResult = value.movePointRight (2);//45565654.5
    BigDecimal secondResult = value.movePointLeft (2);//4556.56545
  • нөлдөрдү кыркыңыз:

    BigDecimal value = new BigDecimal("45056.5000");
    BigDecimal result = value.stripTrailingZeros();//45056.5

    Эгерде бизде чыныгы бөлүктө бардык нөлдөр бар болсо жана бүт бөлүктө нөлдөр болсо (же бизде ондуктар такыр жок), анда:

    BigDecimal value = new BigDecimal("450000.000");
    BigDecimal result = value.stripTrailingZeros();//4.5E+5

BigDecimal тегеректөө эрежелери

Tagеректөө эрежелерин орнотуу үчүн, ичинде BigDecimalбиз тегеректөө алгоритмдерин сүрөттөгөн атайын константаларды көрө алабыз: ROUND_UP- нөлдөн тегеректөө, реалдуу бөлүккө карай тегеректөө:
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_UP );//2.6
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UP );//-2.5
ROUND_DOWN— нөлгө тегеректөө, башкача айтканда, чыныгы бөлүгүн кыскартуу:
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_DOWN  );//2.5
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_DOWN  );//-2.6
ROUND_CEILING— оң чексиздикке тегеректөө. Башкача айтканда, биздин сан оң болсо, анда -> ROUND_UP, терс болсо, анда ->ROUND_DOWN
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_CEILING);//2.6
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_CEILING);//-2.5
ROUND_FLOOR- терс чексиздикке тегеректөө, башкача айтканда, биздин сан оң болсо, анда -> ROUND_DOWN, терс болсо, анда ->ROUND_UP
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_FLOOR);//2.5
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_FLOOR);//-2.6
Каралып жаткан маани үчүн биз кыскартылган ондук белгиси бар бул эң жакын санды каралып жаткан сандын жакынкы кошунасы катары карайбыз. Мисалы, 2,43 2,5 караганда 2,4 жакыныраак болот, бирок 2,48 2,5 жакын болот. ROUND_HALF_DOWN— «жакынкы кошунага» тегеректөө. Эгерде эки кошуна тең белгилүү бир мааниден бирдей аралыкта болсо, анда нөлгө тегеректөө жүргүзүлөт. Мисалы, тегеректелген сан 5ке барабар болсо жана ал 0 менен 10го чейинки аралыкка барабар болсо):
BigDecimal firstValue = new BigDecimal("2.58");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_HALF_DOWN );//2.6
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_HALF_DOWN );//2.5
ROUND_HALF_UP— «жакынкы кошунага» тегеректөө режими. Эки кошуна тең бирдей алыстыкта ​​болсо, тегеректөө жүргүзүлөт (бул бизди мектепте үйрөткөн тегеректөө):
BigDecimal firstValue = new BigDecimal("2.53");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_HALF_UP  );//2.5
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_HALF_UP  );//2.6
ROUND_HALF_EVEN— эки кошуна тең бирдей эмес болсо, «жакынкы кошунага» тегеректөө. Мында тегеректелип жаткан сандын алдында так сан келсе, ал тегеректелет, ал эми жуп болсо, ылдый тегеректелет:
BigDecimal firstValue = new BigDecimal("2222.2225");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.222
Бул жыйынтыкты алабыз, анткени тегеректөөдө 5 мурунку 2 санын карап, анын жуп экенин көрүп, тегеректейт. Бирок эгер:
BigDecimal firstValue = new BigDecimal("2222.22255");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.223
Бул тегеректөө жогорулайт, анткени акыркы 5 мурунку маанини карап, так санды көрөт. Натыйжада, сан 6га чейин тегеректелет, андан кийин кийинки 6 да тегеректелет. Бирок алтоо мындан ары сол жактагы санды караbyte, анткени бул сан жогоруга жакыныраак жана натыйжада акыркы 2 1ге көбөйөт. ROUND_UNNECESSARY- санды тегеректөөнүн кереги жок экенин текшерүү үчүн колдонулат. Башкача айтканда, биз санда талап кылынган ондук бөлүктөрдүн саны бар экендигин текшеребиз:
BigDecimal firstValue = new BigDecimal("2.55");
BigDecimal firstResult =  firstValue.setScale(2, BigDecimal.ROUND_UNNECESSARY);//2.55
Бул жерде баары жакшы, мааниде эки сан бар жана ондук чекиттен кийин эки гана цифра бар экенин текшеребиз. Бирок эгер:
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UNNECESSARY);
Андан кийин биз - ды алабыз ArithmeticException, анткени текшерorп жаткан маани белгиленген ондук орундардын санынан ашат. Бирок биз эки ондук белгини текшерсек, бирок чындыгында ал жерде бир бар болсо, анда өзгөчөлүк ташталbyte, ал эми жетишпеген сандар жөн эле нөл менен толукталат:
BigDecimal thirdValue = new BigDecimal("2.5");
BigDecimal thirdResult = thirdValue.setScale(3, BigDecimal.ROUND_UNNECESSARY   );//2.500
Мен дагы белгилегим келет y BigDecimalтуруктууларга окшош константаларга ээ BigInteger ZEROжана ONE. Бул жерде documentациягаTEN шилтеме . Акырында: сиз байкагандай, an objectтер менен операцияларды аткарууда жана , биз эскилерин алмаштырбайбыз, бирок дайыма жаңыларын алабыз. Бул алардын , б.а., жаратылгандан кийин өзгөрүлгүс экенин, . Башкача айтканда, алардын бардык ыкмалары an objectтин ички абалын өзгөртө алbyte, эң көп дегенде, алар биз колдонуп жаткан функция тарабынан көрсөтүлгөн параметрлер менен жаңы an objectти кайтара алат. BigIntegerBigDecimalimmutableString
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION