JavaRush /Блоги Java /Random-TG /BigInteger ва BigDecimal

BigInteger ва BigDecimal

Дар гурӯҳ нашр шудааст
Дар Java, барнома аз синфҳо ва синфҳо аз усулҳо ва тағирёбандаҳо иборатанд. Тағйирёбандаҳо дар навбати худ ба ибтидоӣ ва истинод тақсим мешаванд. BigInteger ва BigDecimal - 1Дар Java 8 намуди тағирёбандаҳо мавҷуданд ва ба истиснои booleanва char, онҳо ба намудҳои зерин тақсим мешаванд:
  • ададҳои бутун: byte, short, intва long;
  • нуқтаи шинокунанда (инчунин рақамҳои воқеӣ номида мешавад): floatва double.
Дар дохor ин гурӯҳҳои хурд фарқиятҳо танҳо дар доираи арзишҳое мавҷуданд, ки метавонанд дар бар гиранд (ва мутаносибан фазои ишғоли чунин тағирёбанда фарқ мекунад). Бузургтарин навъҳои бутун long, бо диапазон аз -9223372036854775808 то 9223372036854775807. Аз рақамҳои нуқтаи шинокунанда, , doubleбо диапазони 1,7e-308 то 1,7e+308. Шумо метавонед бештар дар бораи рақамҳои воқеӣ дар ин мақола хонед . Аммо чӣ мешавад, агар ба мо лозим ояд, ки рақамҳоеро, ки аз доираи қобor қабул калонтаранд, нигоҳ дорем? Дар ин сурат ба мо лозим меояд BigIntegerва BigDecimal.

BigInteger дар Java

Синфи Java BigIntegerҳамчун аналоги арзишҳои бутуни дарозии худсарона истифода мешавад, ки маҳдудияти 64-битии дарозиро надорад. Ғайр аз он, он насли синф аст 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бо арзиши мо ба конструктор интиқол дода мешавад, аммо дар формати сатр. Қобor зикр аст, ки вай зиёда аз як дизайнер дорад, аммо барои ҳама ҳолатҳо. Агар навъҳои ибтидоӣ ҳаҷми пурраи маълумотро аз . ҷойгир накунанд BigInteger, маълумот ба доираи он навъи ибтидоӣ бурида мешавад. intValueExact()Аммо дар айни замон, аналогҳои ин усулҳо ( , ва ғ.) мавҷуданд longValueExact(), ки фарқияти ягона дар он аст, ки агар навъи оддӣ, ки ба он табдил дода мешавад, диапазони маълумотро дар бар нагирад, ArithmeticException партофта мешавад .

Константҳои BigInteger

Барои истифодаи дохилӣ, синф доимӣ дорад:
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
Инҳо an objectҳои доимӣ BigIntegerбо арзишҳо, мутаносибан 0, 1ва 10.

Усулҳои BigInteger

Яке аз хусусиятҳои асосии ин синф дар он аст, ки он пур аз усулҳое мебошад, ки амалҳои арифметикии стандартиро дар Java амалӣ мекунанд. Барои намуна:
  • амалиёти ҷамъбастӣ:

    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
Албатта, беҳтар аст, ки ба рӯйхати пурраи усулҳо дар ҳуҷҷатҳо нигаред . BigInteger ва BigDecimal - 2

BigDecimal дар Java

Вақте ки ба мо шумораи воқеии дарозии ихтиёрӣ лозим аст, синфи 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, зеро синф интихоби васеътари онҳоро дорад. Конструкторҳое ҳастанд, ки ба шумо имкон медиҳанд, ки арзиши an objectро бо роҳҳои гуногун муқаррар кунед (бо гузариши 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
Мо як қатор аломатҳоро муқаррар мекунем, ки аз кадом элемент мо арзишҳои an objectро мегирем ва чанде аз ин элементҳоро мегирем.
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

Барои муқаррар кардани қоидаҳои яклухткунӣ дар дохor 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-и оянда низ мудаввар карда мешавад. Аммо шаш нафар дигар ба рақами тарафи чап нигоҳ намекунанд, зеро ин рақам ба боло наздиктар аст ва дар натиҷа 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, зеро арзиши санҷидашуда аз шумораи муқарраршудаи ададҳои даҳӣ зиёд аст. Аммо агар мо ду адади даҳиро тафтиш кунем, аммо дар асл як он ҷо вуҷуд дорад, пас истисно партофта намешавад ва рақамҳои гумшуда танҳо бо сифрҳо пурра карда мешаванд:
BigDecimal thirdValue = new BigDecimal("2.5");
BigDecimal thirdResult = thirdValue.setScale(3, BigDecimal.ROUND_UNNECESSARY   );//2.500
Ман инчунин мехоҳам қайд намоям, ки y константаҳои BigDecimalшабеҳи доимӣ дорад BigInteger ZEROва ONE. TENИн аст пайванд ба ҳуҷҷатҳо . Ва нихоят: чунон ки шумо эхтимол пай бурдед, хангоми ичрои амалхо бо предметхо BigIntegerва BigDecimal, мо кухнахоро иваз намекунем, балки хамеша навашро мегирем. Ин ба мо мегӯяд, ки онҳо immutable, яъне пас аз офаринишашон тағйирнопазиранд, ба мисли String. Ба ибораи дигар, ҳама усулҳои онҳо ҳолати дохorи an objectро тағир дода наметавонанд; ҳадди аксар онҳо метавонанд an objectи навро бо параметрҳои муайянкардаи функсияе, ки мо истифода мебарем, баргардонанд.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION