JavaRush /Blog Jawa /Random-JV /BigInteger lan BigDecimal

BigInteger lan BigDecimal

Diterbitake ing grup
Ing Jawa, aplikasi digawe saka kelas, lan kelas digawe saka metode lan variabel. Variabel, ing siji, dipérang dadi primitif lan referensi. BigInteger lan BigDecimal - 1Ana 8 jinis variabel ing Jawa lan, ora kalebu booleanlan char, dipérang dadi jinis ing ngisor iki:
  • wilangan bulat: byte, short, intlan long;
  • titik ngambang (uga disebut wilangan nyata): floatlan double.
Ing klompok cilik iki, beda mung ana ing sawetara nilai sing bisa ngemot (lan, kanthi mangkono, spasi sing dikuwasani saka variabel kasebut beda-beda). Jinis integer paling gedhé yaiku 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 BigIntegerlan BigDecimal.

BigInteger ing Jawa

Kelas Jawa BigIntegerdigunakake 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, Doublelan 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 BigIntegerkanthi 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 BigIntegerkanthi nilai, masing-masing, 0, 1lan 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
Ana uga cara kanggo operasi sing luwih rumit (spesifik):
  • operasi karo pitungan mod :

    BigInteger firstValue = new BigInteger("-34");
    BigInteger secondValue = new BigInteger("5");
    BigInteger resultValue = firstValue.mod(secondValue); //1
Ana sawetara variasi saka fungsi iki:
  • 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
Mesthine, luwih becik ndeleng dhaptar lengkap metode ing dokumentasi . BigInteger lan BigDecimal - 2

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, BigDecimalminangka turunan saka kelas Numberlan 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 konstruktor BigDecimal, 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, Stringlan 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 kasebut BigDecimaluga ngemot cara kanggo macem-macem operasi aritmetika, nanging BigIntegerora duwe cara kanggo nggarap bit, kayata. Nanging, fitur utama BigDecimalyaiku 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 BigDecimalkaro liyane BigDecimal, 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 njero BigDecimalkita 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 BigDecimalnduweni konstanta padha karo konstanta BigInteger ZERO, ONElan TEN. Punika link menyang dokumentasi . Lan pungkasanipun: sing mbokmenawa sampeyan weruh, nalika nindakake operasi karo obyek BigIntegerlan 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.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION