JavaRush /Java Blogu /Random-AZ /BigInteger və BigDecimal

BigInteger və BigDecimal

Qrupda dərc edilmişdir
Java-da proqram siniflərdən, siniflər isə metodlardan və dəyişənlərdən ibarətdir. Dəyişənlər də öz növbəsində primitiv və istinada bölünür. BigInteger və BigDecimal - 1Java-da 8 növ dəyişən var və və istisna olmaqla boolean, charonlar aşağıdakı növlərə bölünür:
  • tam ədədlər: byte, short, intlong;
  • üzən nöqtə (həqiqi ədədlər də deyilir): floatdouble.
Bu kiçik qruplar daxilində fərqlər yalnız ehtiva edilə bilən dəyərlər diapazonunda mövcuddur (və müvafiq olaraq belə bir dəyişənin işğal edilmiş sahəsi dəyişir). Tam ədəd növlərinin ən böyüyü long-9223372036854775808 ilə 9223372036854775807 diapazonu ilə . Üzən nöqtəli ədədlərdən, double1,7e-308 ilə 1,7e+308 diapazonu ilə. Həqiqi rəqəmlər haqqında daha çox bu məqalədə oxuya bilərsiniz . Bəs məqbul diapazondan daha böyük rəqəmləri saxlamalı olsaq nə etməli? Bu halda bizə lazım olacaq BigIntegerBigDecimal.

Java-da BigInteger

Java sinfi BigInteger64 bitlik uzunluq həddi olmayan ixtiyari uzunluqlu tam dəyərlərin analoqu kimi istifadə olunur. Üstəlik, o, rəqəmli sadə növlər üçün Numberstandart sarğılar kimi - Integer, Long, və s. - sinifinin nəslindəndir , buna görə də sadə növlərə aparan metodların tətbiqi var: ByteDouble
BigInteger value = new BigInteger("32145");

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

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

double doubleValue = value.doubleValue();//32145.0
BigIntegerDərhal biz dəyərimizin konstruktora ötürülməsi ilə belə bir obyektin yaradılmasını görürük , lakin string formatında. Qeyd etmək lazımdır ki, onun birdən çox dizayneri var, lakin bütün hallar üçün. Əgər ibtidai tiplər məlumatların tam həcmini özündə cəmləşdirmirsə BigInteger, verilənlər həmin primitiv növün diapazonuna kəsiləcək. Lakin eyni zamanda, bu metodların analoqları ( intValueExact(), longValueExact()və s .

BigInteger Sabitləri

Daxili istifadə üçün sinifdə sabitlər var:
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
Bunlar BigIntegermüvafiq olaraq, və dəyərləri olan 0daimi obyektlərdir . 110

BigInteger Metodları

Bu sinfin əsas xüsusiyyətlərindən biri Java-da standart hesab əməliyyatlarını həyata keçirən metodlarla dolu olmasıdır. Misal üçün:
  • toplama əməliyyatları:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.add(secondValue);//73461
  • vurma əməliyyatları:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.multiply(secondValue);//1347530670
  • bir ədədi digərinə bölərkən qalığı tapmaq əməliyyatları:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.remainder(secondValue);//2529
  • ədədin mütləq dəyərini əldə etmək (yəni modul, işarəsiz):

    BigInteger firstValue = new BigInteger("-37995");
    BigInteger resultValue =  firstValue.abs();//37995
Daha mürəkkəb (xüsusi) əməliyyatlar üçün üsullar da var:
  • mod hesablanması ilə əməliyyatlar :

    BigInteger firstValue = new BigInteger("-34");
    BigInteger secondValue = new BigInteger("5");
    BigInteger resultValue = firstValue.mod(secondValue); //1
Bu funksiyanın bir neçə fərqli variantı var:
  • təsadüfi bir ədəd əldə etmək və nəticədə alınan dəyərin istifadə edəcəyi bitlərin sayını təyin etmək:

    BigInteger firstValue = BigInteger.probablePrime(8, new Random());//211
    BigInteger secondValue = BigInteger.probablePrime(16, new Random());//42571
  • bit istiqamətində sürüşmə əməliyyatları (bu >> n)

    Sola sürüşdürün:

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

    Sağa sürüşdürün:

    BigInteger secondValue = new BigInteger("34");
    BigInteger secondResultValue = secondValue.shiftRight(2); //8
Əlbəttə ki, sənədlərdə metodların tam siyahısına baxmaq daha yaxşıdır . BigInteger və BigDecimal - 2

Java-da BigDecimal

Həqiqi sayda ixtiyari uzunluğa ehtiyacımız olduqda, Java sinfindən istifadə olunur - BigDecimal. doubleBir qayda olaraq, daha çox fərdiləşdirmə variantları verdiyi üçün əvəzinə maliyyə ilə işləmək üçün istifadə olunur . Like və BigInteger, BigDecimalsinifin nəslindəndir Numbervə obyektin dəyərini xüsusi primitiv tip kimi qaytaran üsullara malikdir:
BigDecimal value = new BigDecimal(35563.3);

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

double doubleValue = value.doubleValue();//35563.3
-a azaldarkən gördüyümüz kimi longyalnız tam hissə qalır, onluq yerləri isə atılır.

BigDecimal konstruktorları

Konstruktorlara daha yaxından nəzər salacağıq BigDecimal, çünki sinifdə onlardan daha geniş seçim var. Obyektin qiymətini müxtəlif üsullarla təyin etməyə imkan verən konstruktorlar var ( int, long, double, Stringvə hətta keçid yolu ilə BigInteger) və buna icazə verənlər də var. yaradılmış obyektin parametrlərini təyin edin (yuvarlaqlaşdırma üsulları, onluq yerlərin sayı):
BigDecimal firstValue = new BigDecimal("455656.545");//455656.545
Burada hər şey aydındır, biz görmək istədiyimiz onluq yerlərin dəyərini və sayını birbaşa təyin edirik.
BigDecimal secondValue = new BigDecimal(3445.54);//3445.5399999999999636202119290828704833984375
Bu konstruktorun nəticələri olduqca gözlənilməz ola bilər, çünki biz öz təbiətinə görə çox qeyri-müəyyən tip olan dublunu qeyd edirik. Buna görə də, ümumiyyətlə konstruktorda istifadə etmək tövsiyə olunur String.
BigDecimal thirdValue = new BigDecimal(3445.554645675444, MathContext.DECIMAL32);//3445.555
Biz təyin etdik double, lakin eyni zamanda yuvarlaqlaşdırma qaydasını (onluq yerlərin sayını və yuvarlaqlaşdırma alqoritmini ehtiva edən) təsvir edən bir parametr də təyin etdik.
char[] arr = new String("455656.545").toCharArray();

BigDecimal fourthValue = new BigDecimal(arr, 2, 6);//5656.5
Obyekt üçün dəyərləri hansı elementdən aldığımızı və bu elementlərdən neçəsini aldığımızı simvollar massivi təyin edirik.
BigDecimal fifthValue = new BigDecimal(new BigInteger("44554"), 3);//44.554
Artıq mövcud olan obyekti götürürük BigInteger, onluq yerlərin sayını təyin edirik.

BigDecimal Metodlar

Sinif BigDecimalhəmçinin müxtəlif arifmetik əməliyyatlar üçün metodları ehtiva edir, lakin BigIntegeronun kimi bitlərlə işləmək üçün metodları yoxdur. Ancaq buna baxmayaraq, əsas xüsusiyyət BigDecimalüzən nöqtə nömrələri ilə işləməkdə rahatlıqdır. Həqiqi ədədləri mənimsəmək üçün bizə güc verən bəzi texnikalara baxaq:
  • dəqiqliyi alırıq (rəqəmlərin sayı):

    BigDecimal value = new BigDecimal("454334.34334");
    int result = value.precision();//11
  • onluq yerlərin sayını və yuvarlaqlaşdırma qaydasını təyin edin:

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

    Aşağıda yuvarlaqlaşdırma qaydalarını təyin etmək üçün sabitləri daha yaxından nəzərdən keçirəcəyik.

  • lazımi onluq yerləri və yuvarlaqlaşdırma qaydasını göstərərək BigDecimalbaşqa birinə bölün :BigDecimal

    BigDecimal firstValue = new BigDecimal("455656.545");
    
    BigDecimal secondValue = new BigDecimal(3445.544445);
    
    BigDecimal result = firstValue.divide(secondValue, 2,RoundingMode.DOWN);//132.24
  • ondalık nöqtəni müəyyən sayda yerlə sağa/sola köçürmək:

    BigDecimal value = new BigDecimal("455656.545");
    BigDecimal firstResult = value.movePointRight (2);//45565654.5
    BigDecimal secondResult = value.movePointLeft (2);//4556.56545
  • arxadakı sıfırları kəsin:

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

    Həqiqi hissədə bütün sıfırlarımız varsa və bütün hissədə də sıfırlar varsa (yaxud bizdə onluq yer yoxdur), onda:

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

BigDecimal yuvarlaqlaşdırma qaydaları

Yuvarlaqlaşdırma qaydalarını təyin etmək üçün içəridə BigDecimalyuvarlaqlaşdırma alqoritmlərini təsvir edən xüsusi sabitləri görə bilərik: ROUND_UP- sıfırdan yuvarlaqlaşdırma, həqiqi hissəyə doğru yuvarlaqlaşdırma:
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— sıfıra yuvarlaqlaşdırma, yəni real hissənin kəsilməsi:
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— müsbət sonsuzluğa yuvarlaqlaşdırma. Yəni sayımız müsbətdirsə, onda -> ROUND_UP, mənfidirsə, ->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- mənfi sonsuzluğa yuvarlaqlaşdırma, yəni sayımız müsbətdirsə, onda -> ROUND_DOWN, mənfisə, 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
Nəzərdən keçirilən dəyər üçün kəsilmiş onluq yer ilə bu ən yaxın ədədi nəzərdən keçirilən ədədin ən yaxın qonşusu kimi nəzərdən keçirəcəyik. Məsələn, 2.43 2.5-dən 2.4-ə yaxın olacaq, lakin 2.48 2.5-ə yaxın olacaq. ROUND_HALF_DOWN— “ən yaxın qonşuya” yuvarlaqlaşdırma. Hər iki qonşu müəyyən bir dəyərdən bərabər məsafədədirsə, sıfıra yuvarlaqlaşdırılır. Məsələn, yuvarlaqlaşdırılan ədəd 5 olduqda və 0 və 10-dan eyni məsafədə olduqda bərabər məsafədir):
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— “ən yaxın qonşuya” yuvarlaqlaşdırma rejimi. Hər iki qonşu bərabər məsafədədirsə, yuvarlaqlaşdırma aparılır (bu, bizə məktəbdə öyrədilən yuvarlaqlaşdırmadır):
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— hər iki qonşu bərabər məsafədə deyilsə, “ən yaxın qonşuya” yuvarlaqlaşdırma. Bu halda yuvarlaqlaşdırılan ədədin qarşısında tək ədəd varsa, yuxarı yuvarlaqlaşdırılır, cütdürsə, aşağı yuvarlaqlaşdırılır:
BigDecimal firstValue = new BigDecimal("2222.2225");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.222
Bu nəticəni ona görə alırıq ki, yuvarlaqlaşdırarkən 5 əvvəlki 2 rəqəminə baxır və cüt olduğunu görəndə aşağı yuvarlanır. Amma əgər:
BigDecimal firstValue = new BigDecimal("2222.22255");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.223
Bu yuvarlaqlaşdırma yuxarı qalxır, çünki son 5 əvvəlki dəyərə baxır və tək rəqəm görür. Nəticədə, nömrə 6-a qədər yuvarlaqlaşdırılır, bundan sonra növbəti 6 da yuvarlaqlaşdırılır. Amma altı artıq soldakı rəqəmə baxmır, çünki rəqəm aydın şəkildə yuxarıya doğru yaxınlaşır və nəticədə sonuncu 2 1 artır. ROUND_UNNECESSARY- rəqəmin yuvarlaqlaşdırılmasına ehtiyac olmadığını yoxlamaq üçün istifadə olunur. Yəni nömrənin lazımi sayda onluq yerlərə sahib olduğunu yoxlayırıq:
BigDecimal firstValue = new BigDecimal("2.55");
BigDecimal firstResult =  firstValue.setScale(2, BigDecimal.ROUND_UNNECESSARY);//2.55
Burada hər şey yaxşıdır, dəyərin iki rəqəmi var və ondalık nöqtədən sonra yalnız iki rəqəmin olduğunu yoxlayırıq. Amma əgər:
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UNNECESSARY);
Sonra - alırıq ArithmeticException, çünki yoxlanılan dəyər göstərilən onluq yerlərin sayını üstələyir. Ancaq iki onluq yerləri yoxlasaq, amma əslində orada biri varsa, istisna atılmayacaq və çatışmayan rəqəmlər sadəcə sıfırlarla tamamlanır:
BigDecimal thirdValue = new BigDecimal("2.5");
BigDecimal thirdResult = thirdValue.setScale(3, BigDecimal.ROUND_UNNECESSARY   );//2.500
Onu da qeyd edim ki, y -nin sabitlərə BigDecimaloxşar sabitləri var BigInteger ZEROONE. Budur sənədlərəTEN keçid . Və nəhayət: yəqin ki, qeyd etdiyiniz kimi, obyektlərlə əməliyyatlar apararkən və , biz köhnələri dəyişdirmirik, lakin həmişə yenilərini alırıq. Bu, onların , yəni yaradıldıqdan sonra dəyişməz olduqlarını bildirir . Başqa sözlə, onların bütün metodları obyektin daxili vəziyyətini dəyişə bilməz, ən çox istifadə etdiyimiz funksiya ilə müəyyən edilmiş parametrlərlə yeni bir obyekt qaytara bilər. BigIntegerBigDecimalimmutableString
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION