JavaRush /Java Blog /Random-TK /BigInteger we BigDecimal

BigInteger we BigDecimal

Toparda çap edildi
Java-da bir programma sapaklardan, synplar usullardan we üýtgeýjilerden durýar. Üýtgeýjiler, öz gezeginde, başlangyç we salgylanmalara bölünýärler. BigInteger we BigDecimal - 1Java-da üýtgeýänleriň 8 görnüşi bar we muňa girmeýär booleanwe charaşakdaky görnüşlere bölünýär:
  • bitewi sanlar : byte, shortwe ;intlong
  • ýüzýän nokat (hakyky sanlar hem diýilýär): floatwe double.
Bu kiçi toparlaryň içinde tapawutlar diňe bolup biläýjek bahalaryň diapazonynda bar (we şoňa görä şeýle üýtgeýjiniň tutýan meýdany üýtgeýär). Bitewi görnüşleriň iň ulusy long, -9223372036854775808-den 9223372036854775807 aralygynda bolup biler. double1.7e-308 bilen 1.7e + 308 aralygy bilen ýüzýän nokatlaryň sanlaryndan. Hakyky sanlar barada has giňişleýin maglumaty şu makalada okap bilersiňiz . Emma kabul ederlikli aralykdan has uly sanlary saklamaly bolsa näme etmeli? Bu ýagdaýda bize gerek bolar BigIntegerwe BigDecimal.

Java-da BigInteger

Java synpy, BigInteger64 bitlik uzynlygy bolmadyk özbaşdak uzynlyk bitewi bahalara analog hökmünde ulanylýar. Mundan başga-da, sanly ýönekeý Numbergörnüşler üçin adaty örtükler ýaly Integer,,, we ş.m. synpyň nesli , şonuň üçin ýönekeý görnüşlere alyp barýan usullary durmuşa geçirýär: LongByteDouble
BigInteger value = new BigInteger("32145");

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

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

double doubleValue = value.doubleValue();//32145.0
BigIntegerBahasy konstruktora geçýär, ýöne setir görnüşinde şeýle obýektiň döredilmegini derrew görýäris . Birden köp dizaýneriniň bardygyny bellemelidiris, ýöne ähli ýagdaýlarda. Ilkinji görnüşler maglumatlaryň doly mukdaryny ýerleşdirmeýän bolsa BigInteger, maglumatlar şol başlangyç görnüşiň çägine çenli kesiler. Theöne şol bir wagtyň özünde, bu usullaryň (we ş.m.) meňzeşleri bar intValueExact(), longValueExact()ýeke-täk tapawudy, öwrülişigiň ýönekeý görnüşi maglumat aralygyna laýyk gelmeýän bolsa, “ ArithmeticException” zyňylýar .

BigInteger yzygiderliligi

Içerki ulanmak üçin synpyň yzygiderliligi bar:
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
BigIntegerBular degişlilikde bahalar bilen hemişelik obýektler 0we 1.10

BigInteger usullary

Bu synpyň esasy aýratynlyklaryndan biri, Java-da adaty arifmetiki amallary amala aşyrýan usullardan doly. Mysal üçin:
  • jemlemek amallary:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.add(secondValue);//73461
  • köpeltmek amallary:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.multiply(secondValue);//1347530670
  • bir san başga birine bölünende galanlaryny tapmak amallary:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.remainder(secondValue);//2529
  • sanyň mutlak bahasyny almak (ýagny modulo, gol çekilmedik):

    BigInteger firstValue = new BigInteger("-37995");
    BigInteger resultValue =  firstValue.abs();//37995
Has çylşyrymly (anyk) amallaryň usullary hem bar:
  • mod hasaplamak bilen amallar :

    BigInteger firstValue = new BigInteger("-34");
    BigInteger secondValue = new BigInteger("5");
    BigInteger resultValue = firstValue.mod(secondValue); //1
Bu funksiýanyň birnäçe dürli üýtgeşikligi bar:
  • tötänleýin san almak we emele gelen bahanyň ulanjak bitleriniň sanyny görkezmek:

    BigInteger firstValue = BigInteger.probablePrime(8, new Random());//211
    BigInteger secondValue = BigInteger.probablePrime(16, new Random());//42571
  • birneme süýşürmek amallary (bu >> n)

    Çep smena:

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

    Sag tarapa geçiň:

    BigInteger secondValue = new BigInteger("34");
    BigInteger secondResultValue = secondValue.shiftRight(2); //8
Elbetde, resminamalardaky usullaryň doly sanawyna seretmek has gowudyr . BigInteger we BigDecimal - 2

Java-da BigDecimal

Haçan-da hakyky mukdarda özbaşdak uzynlyk gerek bolsa, Java synpy ulanylýar - BigDecimal. doubleDüzgün bolşy ýaly, has özleşdirmek opsiýalaryny berýändigi sebäpli, ýerine maliýe bilen işlemek üçin ulanylýar . Bir synpyň nesli ýaly BigIntegerwe obýektiň bahasyny belli bir başlangyç görnüşi hökmünde yzyna gaýtaryp berýän usullary bar: BigDecimalNumber
BigDecimal value = new BigDecimal(35563.3);

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

double doubleValue = value.doubleValue();//35563.3
Azaldylanda görşümiz ýaly longdiňe bitewi bölek galýar we onluk ýerler taşlanýar.

BigDecimal konstruktorlary

Gurluşykçylara has içgin serederis BigDecimal, sebäbi synpda has giň saýlaw bar. intBir obýektiň bahasyny dürli ýollar bilen (geçip , hatda geçip ) kesgitlemäge mümkinçilik berýän konstruktorlar bar longwe muňa rugsat berýänlerem bar. döredilen obýektiň sazlamalaryny düzüň (tegelek usullar, onluk ýerleriň sany): doubleStringBigInteger
BigDecimal firstValue = new BigDecimal("455656.545");//455656.545
Bu ýerde hemme zat düşnükli, göresimiz gelýän onluk ýerleriň bahasyny we sanyny gönüden-göni kesgitleýäris.
BigDecimal secondValue = new BigDecimal(3445.54);//3445.5399999999999636202119290828704833984375
Bu konstruktoryň netijelerini öňünden çaklap bolmaýar, sebäbi tebigaty boýunça gaty düşnüksiz görnüşi bolan goşa kesgitleýäris. Şonuň üçin adatça konstruktorda ulanmak maslahat berilýär String.
BigDecimal thirdValue = new BigDecimal(3445.554645675444, MathContext.DECIMAL32);//3445.555
Belledik double, ýöne şol bir wagtyň özünde tegelek düzgüni (onluk ýerleriň sanyny we tegeleklemek algoritmini öz içine alýan) parametr hem düzýäris.
char[] arr = new String("455656.545").toCharArray();

BigDecimal fourthValue = new BigDecimal(arr, 2, 6);//5656.5
Haýsy elementden obýekt üçin bahalary alýandygymyzy we bu elementleriň näçesini alýandygymyzy görkezýäris.
BigDecimal fifthValue = new BigDecimal(new BigInteger("44554"), 3);//44.554
Biz eýýäm bar bolan obýekti alýarys BigInteger, onluk ýerleriň sanyny kesgitleýäris.

BigDecimal usullary

Bu synpda BigDecimaldürli arifmetiki amallar üçin usullar hem bar, ýöne BigIntegerbit ýaly işlemek usullary ýok. Emma, ​​muňa garamazdan, esasy aýratynlyk BigDecimalýüzýän nokatlar bilen işlemekde çeýeligi. Hakyky sanlary özleşdirmäge güýç berýän käbir usullara seredeliň:
  • takyklygy alýarys (sanlaryň sany):

    BigDecimal value = new BigDecimal("454334.34334");
    int result = value.precision();//11
  • onluk ýerleriň sanyny we tegelek düzgüni düzüň:

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

    Aşakda tegelek düzgünleri kesgitlemek üçin yzygiderlilige has içgin serederis.

  • gerekli mukdarda onluk ýerleri we tegelek düzgüni görkezmek bilen BigDecimalbaşga birine bölüň :BigDecimal

    BigDecimal firstValue = new BigDecimal("455656.545");
    
    BigDecimal secondValue = new BigDecimal(3445.544445);
    
    BigDecimal result = firstValue.divide(secondValue, 2,RoundingMode.DOWN);//132.24
  • onluk nokady belli bir ýer bilen saga / çepe geçirmek:

    BigDecimal value = new BigDecimal("455656.545");
    BigDecimal firstResult = value.movePointRight (2);//45565654.5
    BigDecimal secondResult = value.movePointLeft (2);//4556.56545
  • yzky nollary kesmek:

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

    Eger hakyky bölegimizde nollaryň hemmesi bar bolsa we tutuş böleginde nollar bar bolsa (ýa-da asla onluk ýerlerimiz ýok), onda:

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

BigDecimal tegelek düzgünleri

Tegelek düzgünlerini kesgitlemek üçin, içerde BigDecimaltegelek algoritmleri suratlandyrýan ýörite yzygiderliligi görüp bileris: ROUND_UP- noldan tegelek, hakyky bölegine tegelek:
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- nola tegelek, ýagny hakyky böleginiň kesilmegi:
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- polo positiveitel çäksizlige tegelek. .Agny, sanymyz polo isitel bolsa, - - ROUND_UP, negatiw bolsa, - -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- otrisatel çäksizlige tegelek, ýagny sanymyz polo isitel bolsa, - - ROUND_DOWN, negatiw bolsa, onda ->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
Göz öňünde tutulýan baha üçin, kesilen onluk ýer bilen bu iň ýakyn belgini seredilýän sanyň iň ýakyn goňşusy hasaplarys. Mysal üçin, 2.43 2,5-den 2,4, 2.48 bolsa 2,5-e ýakyn bolar. ROUND_HALF_DOWN- “iň ýakyn goňşymyza” tegelek. Iki goňşy hem belli bir bahadan deň bolsa, tegelek nola çenli ýerine ýetirilýär. Deňdir, meselem, tegelek san 5 bolanda, 0 we 10 aralygynda şol bir aralyk):
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- “iň ýakyn goňşymyza” tegelek tertibi. Iki goňşy deň bolsa, tegeleklemek amala aşyrylýar (bu mekdepde bize öwredilen şol tegelek):
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- iki goňşy deň bolmasa, “iň ýakyn goňşy” tegelek. Bu ýagdaýda, tegeleklenen san geň bir san bilen öňde bolsa, tegelek bolýar, hatda deň bolsa, tegelek bolýar:
BigDecimal firstValue = new BigDecimal("2222.2225");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.222
Bu netijäni alýarys, sebäbi tegelek bolanda, 5 öňki 2-nji belgä seredýär we hatda hatda tegelekdigini görýär. Iföne:
BigDecimal firstValue = new BigDecimal("2222.22255");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.223
Şol tegelek ýokarlanýar, sebäbi soňky 5 öňki bahasyna seredýär we täsin san görýär. Netijede, san 6-a çenli tegeleklenýär, şondan soň indiki 6-da tegelek bolýar. Sixöne alty adam indi çep tarapdaky sana seredip bilenoklar, sebäbi san has ýokaryk has ýakyn we netijede soňky 2-i 1-e köpeldilýär ROUND_UNNECESSARY- sanyň tegelenmeginiň zerur däldigini barlamak üçin ulanylýar. .Agny, sanyň zerur onluk ýerleriň sanyny barlaýarys:
BigDecimal firstValue = new BigDecimal("2.55");
BigDecimal firstResult =  firstValue.setScale(2, BigDecimal.ROUND_UNNECESSARY);//2.55
Bu ýerde hemme zat gowy, bahanyň iki san bar we onluk nokatdan soň diňe iki sanyň bardygyny barlaýarys. Iföne:
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UNNECESSARY);
Soňra alarys - ArithmeticExceptionsebäbi synag edilýän baha onluk ýerleriň görkezilen sanyndan ýokarydyr. Twoöne iki onluk ýeri barlasak, aslynda ol ýerde bir bar bolsa, kadadan çykma bolmaz we ýiten sanlar diňe nol bilen doldurylýar:
BigDecimal thirdValue = new BigDecimal("2.5");
BigDecimal thirdResult = thirdValue.setScale(3, BigDecimal.ROUND_UNNECESSARY   );//2.500
Şeýle hem , y BigDecimalyzygiderlilige meňzeş yzygiderliligiň bardygyny belläsim gelýär BigInteger ZEROwe ONE. Ine, resminamalaraTEN baglanyşyk . Iň soňunda: obýektler bilen amallary ýerine ýetireniňizde , belki, könelerini üýtgetmeris, ýöne hemişe täzesini alarys. Bu , olaryň bolşy ýaly, ýaradylandan soň üýtgemejekdigini aýdýar . Başgaça aýdylanda, olaryň ähli usullary obýektiň içki ýagdaýyny üýtgedip bilmez; köplenç, ulanýan funksiýamyzda görkezilen parametrler bilen täze obýekti yzyna gaýtaryp biler. BigIntegerBigDecimalimmutableString
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION