boolean
, char
onlar aşağıdakı növlərə bölünür:
- tam ədədlər:
byte
,short
,int
vəlong
; - üzən nöqtə (həqiqi ədədlər də deyilir):
float
vədouble
.
long
-9223372036854775808 ilə 9223372036854775807 diapazonu ilə . Üzən nöqtəli ədədlərdən, double
1,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 BigInteger
və BigDecimal
.
Java-da BigInteger
Java sinfiBigInteger
64 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 Number
standart 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: Byte
Double
BigInteger value = new BigInteger("32145");
int intValue = value.intValue();//32145
long longValue = value.longValue();//32145
double doubleValue = value.doubleValue();//32145.0
BigInteger
Də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 BigInteger
müvafiq olaraq, və dəyərləri olan 0
daimi obyektlərdir . 1
10
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
-
mod hesablanması ilə əməliyyatlar :
BigInteger firstValue = new BigInteger("-34"); BigInteger secondValue = new BigInteger("5"); BigInteger resultValue = firstValue.mod(secondValue); //1
-
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
Java-da BigDecimal
Həqiqi sayda ixtiyari uzunluğa ehtiyacımız olduqda, Java sinfindən istifadə olunur -BigDecimal
. double
Bir qayda olaraq, daha çox fərdiləşdirmə variantları verdiyi üçün əvəzinə maliyyə ilə işləmək üçün istifadə olunur . Like və BigInteger
, BigDecimal
sinifin nəslindəndir Number
və 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 long
yalnız tam hissə qalır, onluq yerləri isə atılır.
BigDecimal konstruktorları
Konstruktorlara daha yaxından nəzər salacağıqBigDecimal
, çü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
, String
və 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
SinifBigDecimal
həmçinin müxtəlif arifmetik əməliyyatlar üçün metodları ehtiva edir, lakin BigInteger
onun 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
BigDecimal
baş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əBigDecimal
yuvarlaqlaş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ə BigDecimal
oxşar sabitləri var BigInteger ZERO
və ONE
. 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. BigInteger
BigDecimal
immutable
String
GO TO FULL VERSION