JavaRush /Java Blog /Random-TK /Java-da BigDecimal

Java-da BigDecimal

Toparda çap edildi
Salam! Şu günki leksiýamyzda köp sanly gürleşeris. , Ok, HAKYKATLAR hakda. Ozal başlangyç maglumatlaryň görnüşleri üçin bahalaryň tablisasyny bir gezekden köp gördük. Ol şeýle görünýär:
Ilkinji görnüş Memoryadyň ululygy Gymmatlyklaryň diapazony
baýt 8 bit -128-den 127-e çenli
gysga 16 bit -32768-den 32767-e çenli
char 16 bit 0-dan 65536-a çenli
int 32 bit -2147483648-den 2147483647-e çenli
uzyn 64 bit -9223372036854775808-den 9223372036854775807-e çenli
ýüzmek 32 bit (2-den güýje -149) çenli ((2-2 güýç -23) * 2-den 127-e çenli)
goşa 64 bit (-2-den 63-e çenli) ((2-den 63-e çenli) - 1)
boolean 8 (massiwlerde ulanylanda), 32 (massiw däl ulanylanda) dogry ýa-da ýalan
Bitewi sanlar barada aýdýan bolsak, iň giň maglumat görnüşi uzyn , ýüzýän nokatlar barada aýdanymyzda bolsa iki esse köpeliň . Weöne bize gerek bolan san şeýle bir köp bolsa, hatda uzyn hem bolmazmy ? Mümkin bolan Uzyn bahalaryň diapazony gaty uly, ýöne belli bir ululykda - 64 bit. Örän uly belgimiziň agramy 100 bit bolsa, näme tapyp bileris? Bagtymyza, hiç zat oýlap tapmagyň zerurlygy ýok. Java-da şeýle ýagdaýlar üçin iki sany ýörite synp döredildi - BigInteger (bitewi sanlar üçin) we BigDecimal (ýüzýän nokatlar üçin). Olaryň aýratynlygy näme? Ilki bilen, teoretiki taýdan iň uly ululyk ýok. Nazary taýdan, sebäbi çäksiz ýady bolan kompýuterler ýok. Programmada kompýuteriň ýadyndan has uly san döreden bolsaňyz, elbetde programma işlemez. Emma beýle ýagdaýlaryň bolmagy gaty ähtimal. Şonuň üçin sanlaryň ululygynyň çäksizdigini aýdyp BigIntegerbileris BigDecimal. Bu sapaklar näme üçin ulanylýar? Ilki bilen, gaty ýokary takyklyk talaplary bilen hasaplamalar üçin. Mysal üçin, adam ömrüniň hasaplamalaryň takyklygyna bagly bolup biljek programmalar bar (uçarlar we raketalar ýa-da lukmançylyk enjamlary üçin programma üpjünçiligi). Şonuň üçin hatda 150-nji onluk ýer hem möhüm rol oýnasa, BigDecimaliň gowy saýlaw. Mundan başga-da, bu obýektler köplenç maliýe dünýäsinde ulanylýar, bu ýerde hasaplamalaryň takyklygy iň kiçi bahalara çenli takyklygy hem möhümdir. Obýektler bilen nädip işlemeli BigIntegerwe BigDecimalolar hakda näme ýatda saklamaly? Bu synplaryň obýektleri şeýle döredilýär:
public class Main {

   public static void main(String[] args) {

       BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
       System.out.println(integer);

       BigDecimal decimal = new BigDecimal("123.444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444");
       System.out.println(decimal);
   }
}
Setiri parametr hökmünde geçirmek mümkin bolan konstruktorlaryň diňe biridir. Bu ýerde setirleri ulanýarys, sebäbi sanlarymyz iň ýokary bahalardan ýokarydyr longwe doublenämüçindir düzüjä haýsy nomeri almak isleýändigimizi düşündirmeli :) Diňe 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111 işlemez: Java synanyşar Geçen belgini başlangyç maglumat görnüşleriniň birine “laýyklaşdyryň”, ýöne olaryň hiç birine laýyk gelmeýär. Şonuň üçin islenýän belgini geçirmek üçin setir ulanmak gowy wariant. Iki synp hem geçen setirlerden san bahalaryny awtomatiki çykaryp biler. Köp sanly synplar bilen işlenende ýatda saklamaly ýene bir möhüm zat, obýektleriniň üýtgemezligi ( Immutable) . Ilkinjiler üçin (Integer, Long we beýlekiler) synp we örtük synplarynyň mysaly arkaly üýtgemezlik prinsipi bilen eýýäm gowy tanyş String.
import java.math.BigInteger;

public class Main {

   public static void main(String[] args) {

       BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
       System.out.println(integer);

       integer.add(BigInteger.valueOf(33333333));
       System.out.println(integer);

   }
}
Konsol çykyşy:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
Garaşyşyňyz ýaly sanlarymyz üýtgemedi. Goşma amalynyň üstünlikli bolmagy üçin täze bir obýekt döretmeli we oňa goşmagyň netijesini bellemeli.
import java.math.BigInteger;

public class Main {

   public static void main(String[] args) {

       BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
       System.out.println(integer);

       BigInteger result = integer.add(BigInteger.valueOf(33333333));
       System.out.println(result);

   }
}
Konsol çykyşy:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111144444444
Indi hemme zat bolmalysy ýaly işleýär :) theeri gelende aýtsak, goşmaça amalyň nähili üýtgeşik görünýändigini gördüňizmi?
BigInteger result = integer.add(BigInteger.valueOf(33333333));
Bu başga bir möhüm nokat. Köp sanly synplar işinde + - * / operatorlary ulanmaýarlar, tersine usullaryň toplumyny üpjün edýärler. Esasylaryna göz aýlalyň (hemişe bolşy ýaly, Oracle resminamalarynda usullaryň doly sanawyny tapyp bilersiňiz: şu ýerde we şu ýerde ).
  1. arifmetiki amallary ýerine ýetirmegiň usullary : add(),,, . Degişlilikde goşmak, aýyrmak, köpeltmek we bölmek amallary üçin ulanylýar.subtract()multiply()divide()

  2. doubleValue(),, we ş.m. intValue()_ - Köp sanly Java başlangyç görnüşine öwürmek üçin ulanylýar. Olary ulananyňyzda seresap boluň we mümkinçilikleriň tapawudyny ýadyňyzdan çykarmaň!floatValue()longValue()

    import java.math.BigInteger;
    
    public class Main {
    
       public static void main(String[] args) {
    
           BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
    
           long result = integer.longValue();
           System.out.println(result);
    
       }
    }

    Konsol çykyşy:

    
    8198552921648689607
  3. min()we max()- geçen iki sany uly sanyň iň pes we iň ýokary bahasyny tapmaga mümkinçilik berýär.
    Üns beriň: usullar statik däl!

    import java.math.BigInteger;
    
    public class Main {
    
       public static void main(String[] args) {
    
           BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
           BigInteger integer2 = new BigInteger("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222");
    
           System.out.println(integer.max(integer2));
    
       }
    }

    Konsol çykyşy:

    
    222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222

BigDecimal tegelek dolandyryş

Bu mowzuk aýratyn bölüme girýär, sebäbi köp sanly tegeleklemek we sazlamak beýle bir ýönekeý zat däl. BigDecimalUlanylýan san üçin onluk ýerleriň sanyny belläp bilersiňiz setScale(). Mysal üçin, 111.55555555555 belginiň takyklygyny üç onluk ýere bellemek isleýäris. Şeýle-de bolsa, usula argument hökmünde 3-nji belgini geçip bilmeris setScale()we şeýlelik bilen meselämizi çözüp bilmeris. Aboveokarda belläp geçişimiz ýaly, BigDecimalbular takyklygy ýokarlandyrylan hasaplamalar üçin sanlardyr. Häzirki görnüşinde biziň sanymyzda 10 onluk ýer bar. Olardan 7-sini taşlap, diňe 3-ni goýmak isleýäris. Şonuň üçin 3-nji belgiden başga-da, tegelek re modeimi parametr hökmünde geçmeli . Jemi 8 tegelek reesim bar BigDecimal. Gaty köp! Emma programmadaky hasaplamalaryň takyklygyny hakykatdanam gowy düzmeli bolsaňyz, munuň üçin zerur zatlaryň hemmesi bolar. Şeýlelikde, ine, 8 sany tegelek reesim bar BigDecimal:
  1. ROUND_CEILING- tegeleklemek

    111.5555555555 -> setScale(3, ROUND_CEILING) -> 111.556
  2. ROUND_DOWN- boşatmak

    111.5555555555 -> setScale(3, ROUND_DOWN) -> 111.555
  3. ROUND_FLOOR- tegelek

    111.5555555555 -> setScale(3, ROUND_FLOOR) -> 111.555

  4. ROUND_HALF_UP- onluk nokatdan soň san = = .5 bolsa tegeleklemek

    0.55 -> setScale(1, ROUND_HALF_UP) -> 0.6
    0.54 -> setScale(1, ROUND_HALF_UP) -> 0.5
  5. ROUND_HALF_DOWN- onluk nokatdan soň san bolsa .5

    0.55 -> setScale(1, ROUND_HALF_DOWN) -> 0.5
    0.56 -> setScale(1, ROUND_HALF_DOWN) -> 0.6
  6. ROUND_HALF_EVEN- tegeleklemek onluk nokadyň çep tarapyndaky sana bagly bolar. Çep tarapdaky san deň bolsa, tegelek aşaklygyna ediler. Onluk nokadyň çep tarapyndaky san geň bolsa, tegelek bolar.

    2.5 -> setScale(0, ROUND_HALF_EVEN) -> 2

    Onluk nokadyň çep tarapyndaky san - 2. Tegelek bolýar. 0 onluk ýer talap edýändigimiz sebäpli netije 2 bolar.

    3.5 -> setScale(0, ROUND_HALF_EVEN) -> 4

    Onluk nokadyň çep tarapyndaky san - 3 - geň. Tegelek ýokarda bolýar. 0 onluk ýer talap edýändigimiz sebäpli netije 4 bolar.

  7. ROUND_UNNECCESSARY- tegelek re modeimi haýsydyr bir usula geçirmeli bolan ýagdaýlarda ulanylýar, ýöne san tegeleklemegiň zerurlygy ýok. ROUND_UNNECCESSARY re modeimi gurlanda bir san aýlamaga synanyşsaňyz, “ArithmeticException” zyňylýar.

    3.51 -> setScale(1, ROUND_UNNECCESSARY) -> ArithmeticException
  8. ROUND_UP- tegeleklemek.

    111.5551 -> setScale(3, ROUND_UP) -> 111.556

Köp sanlary deňeşdirmek

Bu sorag hem möhümdir. Usulyň Java-daky obýektleri deňeşdirmek üçin ulanylýandygyny eýýäm ýadyňyzda saklaýarsyňyz equals(). Eithera-da diliň özi tarapyndan üpjün edilýär (Java-da gurlan sapaklarda) ýa-da programmist tarapyndan ýok edilýär. Emma synp obýektleri meselesinde deňeşdirmek üçin BigDecimalusuly ulanmak maslahat berilmeýär. equals()Munuň sebäbi, BigDecimal.equals()iki sanly usulyň diňe iki san birmeňzeş we masştably bolan ýagdaýynda hakyky gaýdyp gelmegidir: Geliň , y we y usullarynyň özüni alyp barşyny deňeşdireliň : equals()DoubleBigDecimal
import java.math.BigDecimal;

public class Main {

   public static void main(String[] args) {

       Double a = 1.5;
       Double b = 1.50;

       System.out.println(a.equals(b));

       BigDecimal x = new BigDecimal("1.5");
       BigDecimal y = new BigDecimal("1.50");

       System.out.println(x.equals(y));

   }
}
Konsol çykyşy:

true
false
Görşüňiz ýaly, c ýagdaýynda 1.5 we 1.50 sanlar BigDecimaldeň däldi! equals()Bu takyk synpdaky usulyň aýratynlyklary sebäpli bolup geçdi BigDecimal. Ikisini has dogry deňeşdirmek üçin BigDecimalusuly ulanmak has gowudyr compareTo():
import java.math.BigDecimal;

public class Main {

   public static void main(String[] args) {

       BigDecimal x = new BigDecimal("1.5");
       BigDecimal y = new BigDecimal("1.50");

       System.out.println(x.compareTo(y));

   }
}
Konsol çykyşy:

0
Usul compareTo()0-a gaýdyp geldi, bu bolsa 1,5 we 1.50 deňdir. Bu, biziň hasaplaýan netijämiz! :) Bu, şu günki sapagymyzy tamamlaýar. Wezipelere gaýdyp gelmegiň wagty geldi! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION