boolean
ва char
, онҳо ба намудҳои зерин тақсим мешаванд:
- ададҳои бутун:
byte
,short
,int
ваlong
; - нуқтаи шинокунанда (инчунин рақамҳои воқеӣ номида мешавад):
float
ваdouble
.
long
, бо диапазон аз -9223372036854775808 то 9223372036854775807. Аз рақамҳои нуқтаи шинокунанда, , double
бо диапазони 1,7e-308 то 1,7e+308. Шумо метавонед бештар дар бораи рақамҳои воқеӣ дар ин мақола хонед . Аммо чӣ мешавад, агар ба мо лозим ояд, ки рақамҳоеро, ки аз доираи қобor қабул калонтаранд, нигоҳ дорем? Дар ин сурат ба мо лозим меояд BigInteger
ва BigDecimal
.
BigInteger дар Java
Синфи JavaBigInteger
ҳамчун аналоги арзишҳои бутуни дарозии худсарона истифода мешавад, ки маҳдудияти 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
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
Барои муқаррар кардани қоидаҳои яклухткунӣ дар дохorBigDecimal
мо константаҳои махсусро мебинем, ки алгоритмҳои яклухткуниро тавсиф мекунанд: 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и навро бо параметрҳои муайянкардаи функсияе, ки мо истифода мебарем, баргардонанд.
GO TO FULL VERSION