boolean
lan char
, dipérang dadi jinis ing ngisor iki:
- wilangan bulat:
byte
,short
,int
lanlong
; - titik ngambang (uga disebut wilangan nyata):
float
landouble
.
long
, kanthi sawetara saka -9223372036854775808 nganti 9223372036854775807. Saka angka floating point, double
, kanthi rentang 1.7e-308 nganti 1.7e+308. Sampeyan bisa maca liyane babagan nomer nyata ing artikel iki . Nanging apa yen kita kudu nyimpen nomer sing luwih gedhe tinimbang sawetara sing bisa ditampa? Ing kasus iki, kita kudu BigInteger
lan BigDecimal
.
BigInteger ing Jawa
Kelas JawaBigInteger
digunakake minangka analog kanggo nilai integer dawane arbitrary sing ora duwe watesan dawa 64-bit. Kajaba iku, iku turunan saka kelas Number
, kaya pambungkus standar kanggo jinis prasaja numerik - Integer
, Long
, Byte
, Double
lan liya-liyane - mula nduweni implementasi metode sing ngarah menyang jinis prasaja:
BigInteger value = new BigInteger("32145");
int intValue = value.intValue();//32145
long longValue = value.longValue();//32145
double doubleValue = value.doubleValue();//32145.0
Langsung kita ndeleng nggawe obyek kasebut BigInteger
kanthi nilai sing diterusake menyang konstruktor, nanging ing format senar. Wigati dicathet yen dheweke duwe luwih saka siji desainer, nanging kanggo kabeh kesempatan. Yen jinis primitif ora nampung jumlah data lengkap saka BigInteger
, data kasebut bakal dipotong menyang kisaran jinis primitif kasebut. Nanging ing wektu sing padha, ana analog saka metode kasebut ( intValueExact()
, longValueExact()
lan liya-liyane), kanthi bedane mung yen jinis prasaja sing ditindakake konversi ora cocog karo sawetara data, ArithmeticException dibuwang .
Konstanta BigInteger
Kanggo panggunaan internal, kelas kasebut nduweni konstanta:BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
Iki minangka obyek konstan BigInteger
kanthi nilai, masing-masing, 0
, 1
lan 10
.
Metode BigInteger
Salah sawijining fitur utama kelas iki yaiku kebak metode sing ngetrapake operasi aritmetika standar ing Jawa. Tuladhane:-
operasi penjumlahan:
BigInteger firstValue = new BigInteger("37995"); BigInteger secondValue = new BigInteger("35466"); BigInteger resultValue = firstValue.add(secondValue);//73461
-
operasi multiplikasi:
BigInteger firstValue = new BigInteger("37995"); BigInteger secondValue = new BigInteger("35466"); BigInteger resultValue = firstValue.multiply(secondValue);//1347530670
-
operasi nemokake sisa nalika mbagi nomer siji karo liyane:
BigInteger firstValue = new BigInteger("37995"); BigInteger secondValue = new BigInteger("35466"); BigInteger resultValue = firstValue.remainder(secondValue);//2529
-
entuk nilai absolut saka nomer (yaiku, modulo, unsigned):
BigInteger firstValue = new BigInteger("-37995"); BigInteger resultValue = firstValue.abs();//37995
-
operasi karo pitungan mod :
BigInteger firstValue = new BigInteger("-34"); BigInteger secondValue = new BigInteger("5"); BigInteger resultValue = firstValue.mod(secondValue); //1
-
entuk nomer acak lan nemtokake jumlah bit sing bakal digunakake nilai asil:
BigInteger firstValue = BigInteger.probablePrime(8, new Random());//211 BigInteger secondValue = BigInteger.probablePrime(16, new Random());//42571
-
operasi shift bitwise (iki >> n)
Ngalih ngiwa:
BigInteger firstValue = new BigInteger("5"); BigInteger firstResultValue = firstValue.shiftLeft(3);//40
Geser nengen:
BigInteger secondValue = new BigInteger("34"); BigInteger secondResultValue = secondValue.shiftRight(2); //8
BigDecimal ing Jawa
Nalika kita butuh nomer nyata dawa kasepakatan, kelas Jawa digunakake -BigDecimal
. Minangka aturan, digunakake kanggo nggarap keuangan tinimbang double
, amarga menehi pilihan pangaturan dhewe liyane. Kaya lan BigInteger
, BigDecimal
minangka turunan saka kelas Number
lan nduweni metode sing ngasilake nilai obyek minangka jinis primitif tartamtu:
BigDecimal value = new BigDecimal(35563.3);
long longValue = value.longValue();//35563
double doubleValue = value.doubleValue();//35563.3
Nalika kita bisa ndeleng nalika ngurangi kanggo long
, mung bagean integer tetep, lan panggonan desimal dibuwak.
Konstruktor BigDecimal
Kita bakal nliti konstruktorBigDecimal
, amarga kelas kasebut duwe pilihan sing luwih akeh. Ana konstruktor sing ngidini sampeyan nyetel nilai obyek kanthi cara sing beda-beda (kanthi pass int
, long
, double
, String
lan malah BigInteger
), lan ana sing ngidini. atur setelan obyek sing digawe (cara pembulatan, nomer desimal):
BigDecimal firstValue = new BigDecimal("455656.545");//455656.545
Kabeh wis jelas ing kene, kita langsung nyetel nilai lan nomer desimal sing pengin dideleng.
BigDecimal secondValue = new BigDecimal(3445.54);//3445.5399999999999636202119290828704833984375
Asil saka konstruktor iki bisa dadi cukup ranyono, amarga kita nemtokake pindho, kang minangka jinis banget ambigu. Mulane, umume dianjurake kanggo digunakake ing konstruktor String
.
BigDecimal thirdValue = new BigDecimal(3445.554645675444, MathContext.DECIMAL32);//3445.555
Kita nyetel double
, nanging ing wektu sing padha uga nyetel parameter sing njlèntrèhaké aturan babak (sing ngemot nomer desimal lan algoritma kanggo dibunderaké).
char[] arr = new String("455656.545").toCharArray();
BigDecimal fourthValue = new BigDecimal(arr, 2, 6);//5656.5
Kita nyetel macem-macem karakter saka unsur sing njupuk nilai kanggo obyek lan jumlah unsur sing dijupuk.
BigDecimal fifthValue = new BigDecimal(new BigInteger("44554"), 3);//44.554
Kita njupuk obyek sing wis ana BigInteger
, nyetel nomer desimal.
Metode BigDecimal
Kelas kasebutBigDecimal
uga ngemot cara kanggo macem-macem operasi aritmetika, nanging BigInteger
ora duwe cara kanggo nggarap bit, kayata. Nanging, fitur utama BigDecimal
yaiku keluwesan nggarap angka floating point. Ayo goleki sawetara teknik sing menehi kekuwatan kanggo nguwasani nomer nyata:
-
kita entuk presisi (jumlah angka):
BigDecimal value = new BigDecimal("454334.34334"); int result = value.precision();//11
-
atur nomer desimal lan aturan pembulatan:
BigDecimal firstValue = new BigDecimal(3445.544445); BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_CEILING);//3445.545
Ing ngisor iki kita bakal nliti konstanta kanggo nyetel aturan pembulatan.
-
dibagi
BigDecimal
karo liyaneBigDecimal
, nalika nuduhake nomer desimal sing dibutuhake lan aturan pembulatan:BigDecimal firstValue = new BigDecimal("455656.545"); BigDecimal secondValue = new BigDecimal(3445.544445); BigDecimal result = firstValue.divide(secondValue, 2,RoundingMode.DOWN);//132.24
-
mindhah titik desimal nengen/ngiwa kanthi sawetara panggonan:
BigDecimal value = new BigDecimal("455656.545"); BigDecimal firstResult = value.movePointRight (2);//45565654.5 BigDecimal secondResult = value.movePointLeft (2);//4556.56545
-
trim trailing zeros:
BigDecimal value = new BigDecimal("45056.5000"); BigDecimal result = value.stripTrailingZeros();//45056.5
Yen kita duwe kabeh nol ing bagean nyata lan ana uga nol ing kabeh bagean (utawa kita ora duwe panggonan desimal), banjur:
BigDecimal value = new BigDecimal("450000.000"); BigDecimal result = value.stripTrailingZeros();//4.5E+5
Aturan pambulatan BigDecimal
Kanggo nyetel aturan pembulatan, ing njeroBigDecimal
kita bisa ndeleng konstanta khusus sing nggambarake algoritma pembulatan: ROUND_UP
- dibunderake saka nol, dibunderake menyang bagean nyata:
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
- dibunderaké menyang nol, yaiku, truncation saka bagéan nyata:
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
- dibunderaké kanggo infinity positif. Yaiku, yen nomer kita positif, banjur -> ROUND_UP
, yen negatif, banjur ->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
- dibunderaké menyang tanpa wates negatif, yaiku, yen nomer kita positif, banjur -> ROUND_DOWN
, yen negatif, banjur ->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
Kanggo nilai sing dipikirake, kita bakal nimbang nomer paling cedhak iki kanthi papan desimal sing dipotong minangka tetanggan paling cedhak saka nomer sing dianggep. Contone, 2,43 bakal luwih cedhak karo 2,4 tinimbang 2,5, nanging 2,48 bakal luwih cedhak karo 2,5. ROUND_HALF_DOWN
- dibunderaké menyang "tangga sing paling cedhak". Yen loro pepadhamu padha equidistant saka nilai tartamtu, banjur babak kanggo nul dileksanakake. Equidistant, contone, nalika nomer sing dibunderaké 5, lan jarak sing padha saka 0 lan 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
- mode kanggo dibunderaké menyang "tetangga paling cedhak". Yen tanggi loro padha adoh, pembulatan wis rampung (iki padha karo sing diwulangake ing sekolah):
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
- dibunderaké menyang "tangga sing paling cedhak" yen loro tanggane ora padha. Ing kasus iki, yen nomer sing dibunderaké didhisiki karo nomer ganjil, dibunderaké munggah, lan yen genap, dibunderaké mudhun:
BigDecimal firstValue = new BigDecimal("2222.2225");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.222
We njaluk asil iki amarga nalika dibunderaké, 5 katon ing nomer sadurungé 2, lan ndeleng iku malah, babak mudhun. Nanging yen:
BigDecimal firstValue = new BigDecimal("2222.22255");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.223
Rounding sing munggah, wiwit pungkasan 5 katon ing Nilai sadurungé lan ndeleng nomer aneh. Akibaté, nomer kasebut dibunderaké nganti 6, banjur 6 sabanjuré uga dibunderaké. Nanging enem maneh katon ing nomer ing sisih kiwa, wiwit nomer cetha nyedhaki munggah, lan minangka asil pungkasan 2 tambah 1. ROUND_UNNECESSARY
- digunakake kanggo mriksa sing nomer ora perlu dibunderaké. Yaiku, priksa manawa nomer kasebut duwe nomer desimal sing dibutuhake:
BigDecimal firstValue = new BigDecimal("2.55");
BigDecimal firstResult = firstValue.setScale(2, BigDecimal.ROUND_UNNECESSARY);//2.55
Kabeh apik ing kene, nilai kasebut duwe rong digit lan priksa manawa mung ana rong digit sawise titik desimal. Nanging yen:
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UNNECESSARY);
Banjur kita entuk - ArithmeticException
, amarga nilai sing dites ngluwihi nomer desimal sing ditemtokake. Nanging yen kita mriksa rong panggonan desimal, nanging nyatane ana siji, pangecualian ora bakal dibuwang, lan angka ilang mung ditambah karo nul:
BigDecimal thirdValue = new BigDecimal("2.5");
BigDecimal thirdResult = thirdValue.setScale(3, BigDecimal.ROUND_UNNECESSARY );//2.500
Aku uga pengin Wigati sing y BigDecimal
nduweni konstanta padha karo konstanta BigInteger ZERO
, ONE
lan TEN
. Punika link menyang dokumentasi . Lan pungkasanipun: sing mbokmenawa sampeyan weruh, nalika nindakake operasi karo obyek BigInteger
lan BigDecimal
, kita ora ngganti lawas, nanging tansah njaluk anyar. Iki ngandhani yen dheweke iku immutable
, yaiku, ora bisa diganti sawise digawe, kaya String
. Ing tembung liya, kabeh cara kasebut ora bisa ngganti kahanan internal obyek kasebut; paling akeh, bisa ngasilake obyek anyar kanthi parameter sing ditemtokake dening fungsi sing digunakake.
GO TO FULL VERSION