JavaRush /Java блогы /Random-KK /BigInteger және BigDecimal

BigInteger және BigDecimal

Топта жарияланған
Java тілінде қолданба сыныптардан, ал сыныптар әдістер мен айнымалылардан тұрады. Айнымалылар, өз кезегінде, қарабайыр және сілтеме болып бөлінеді. 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 класы 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
BigIntegerБірден біз конструкторға, бірақ жол пішімінде берілген мәнмен осындай нысанның жасалуын көреміз . Айта кету керек, оның бірнеше дизайнері бар, бірақ барлық жағдайларда. Қарапайым түрлер деректердің толық көлемін сыйдырмаса BigInteger, деректер сол қарабайыр түрдің ауқымына қысқартылады. Бірақ сонымен бірге бұл әдістердің аналогтары ( intValueExact(), longValueExact()т.б.) бар, тек айырмашылығы, егер түрлендіру жүріп жатқан қарапайым тип деректер ауқымын орналастырмаса, ArithmeticException шығарылады .

BigInteger тұрақтылары

Ішкі пайдалану үшін сыныпта тұрақтылар бар:
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
Бұл сәйкесінше BigInteger, және мәндері бар 0тұрақты нысандар . 110

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

Java тіліндегі BigDecimal

Бізге еркін ұзындықтың нақты саны қажет болғанда, Java класы пайдаланылады - BigDecimal. Әдетте, ол орнына қаржымен жұмыс істеу үшін пайдаланылады double, өйткені ол көбірек теңшеу опцияларын береді. Like және BigInteger, BigDecimalкласс ұрпағы болып табылады Numberжәне нақты қарабайыр тип ретінде нысанның мәнін қайтаратын әдістерге ие:
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), және оған рұқсат беретіндер бар. құрылған нысанның параметрлерін орнатыңыз (дөңгелектеу әдістері, ондық сандар саны):
BigDecimal firstValue = new BigDecimal("455656.545");//455656.545
Мұнда бәрі түсінікті, біз көргіміз келетін ондықтардың мәні мен санын тікелей орнатамыз.
BigDecimal secondValue = new BigDecimal(3445.54);//3445.5399999999999636202119290828704833984375
Бұл конструктордың нәтижелері өте күтпеген болуы мүмкін, өйткені біз double-ды көрсетеміз, ол өзінің табиғаты бойынша өте түсініксіз түрі болып табылады. Сондықтан оны әдетте конструкторда пайдалану ұсынылады 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
Біз бұрыннан бар нысанды аламыз 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 дөңгелектеу ережелері

Дөңгелектеу ережелерін орнату үшін ішінде 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 сілтеме берілген . Соңында: сіз байқағаныңыздай, және an objectілерімен операцияларды орындау кезінде біз ескілерін өзгертпейміз, бірақ әрқашан жаңаларын аламыз. Бұл олардың , яғни жаратылғаннан кейін өзгермейтінін көрсетеді . Басқаша айтқанда, олардың барлық әдістері an objectінің ішкі күйін өзгерте алмайды, ең көбі біз пайдаланып жатқан функциямен көрсетілген параметрлері бар жаңа нысанды қайтара алады. BigIntegerBigDecimalimmutableString
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION