Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 17373|Atsakyti: 0

[Šaltinis] java.math.BigDecimal klasė

[Kopijuoti nuorodą]
Paskelbta 2015-04-07 14:53:05 | | |

Didelių skaičių operacijų klasės pateikiamos java, būtent java.math.BinInteger klasė ir java.math.BigDecimal klasė. Šios dvi klasės naudojamos didelio tikslumo skaičiavimui: BigInteger klasė yra didelių sveikųjų skaičių apdorojimo klasė, o BigDecimal klasė yra didelių ir mažų skaičių apdorojimo klasė. Žemiau pristatome BigDecimal klasę:
Diegiant BigDecimal naudojama BigInteger, išskyrus tai, kad BigDecimal prideda dešimtainių skaičių sąvoką. Bendrieji plūduriuojantys ir dvigubo tipo duomenys gali būti naudojami tik moksliniams skaičiavimams ar inžineriniams skaičiavimams, nes komerciniuose skaičiavimuose reikalingas skaitinis tikslumas yra gana didelis, todėl naudojama java.math.BigDecimal klasė, kuri palaiko bet kokį fiksuotų taškų tikslumą ir gali būti naudojama tiksliai apskaičiuoti valiutos vertes. Žemiau trumpai pristatysime jo naudojimą su pavyzdžiais

java.math.BigDecimal

Šiandien parašiau programą apie dvejetainį ir dešimtainį konvertavimą, remdamasis vadovėliu, o programos algoritmas nėra sunkus, tačiau parašęs pastebėjau, kad nesvarbu, ar tai yra nuo 2 iki 10, ar nuo 10 iki 2, tai nėra gera konversija skaičiams, didesniems nei 2,1 milijardo, tai yra daugiau nei sveikųjų skaičių diapazonas. taps 0.
Žinynuose nustatyta, kad naudojant BigInteger ši problema išsprendžiama.
Taigi aš ieškojau JDK, tada išbandžiau jį kelis kartus ir galiausiai parašiau sėkmingai!
Naudojimo patirtis yra tokia:

1. BigInteger priklauso java.math.BigInteger, todėl importuokite šią klasę prieš kiekvieną naudojimą. Kartais pradžioje pamiršdavau importuoti, todėl raginimo negalima rasti nuolatiniame raginime.

2. Yra daugybė statybos būdų, tačiau dabar jie retkarčiais naudojami:
BigInteger(Eilutės val.)
          Konvertuoti dešimtainės eilutės vaizdą BigInteger į BigInteger.
BigInteger(Eilutės val, int radix)
          Konvertuoja nurodyto kardinalumo BigInteger eilutės vaizdą į BigInteger.
Norėdami konvertuoti 2 int tipo į BigInteger tipą, parašykite BigInteger two=new BigInteger("2"); 2 pastaba dvigubų kabučių negalima praleisti

3. BigInteger klasė imituoja visas int tipo matematines operacijas, tokias kaip add()=="+", divide()=="-" ir kt., tačiau atkreipkite dėmesį, kad jos turinys negali būti tiesiogiai naudojamas matematinėms operacijoms atliekant matematines operacijas, ir turi naudoti vidinius metodus. Jo operandas taip pat turi būti BigInteger tipo.
Pavyzdžiui: two.add(2) yra neteisinga operacija, nes 2 netampa BigInteger tipu.

4. Kai norite išvesti skaičiavimo rezultatus, turėtumėte naudoti .toString metodą, kad konvertuotumėte jį į dešimtainę eilutę, kaip aprašyta toliau:
Eilutė į eilutę()
          Grąžina šio BigInteger dešimtainės eilutės vaizdą.
Išvesties metodas: System.out.print(two.toString());

5. Paaiškinkite tris naudojamas funkcijas.   
BigInteger likutis (BigInteger val)
          Grąžina BigInteger, kurio reikšmė yra (ši % reikšmė).
BigInteger negate()
          BigInteger grąžina reikšmę (-this).
int compareTo(BigInteger val)
          Palyginkite šį BigInteger su nurodytu BigInteger.
likutis naudojamas likučiui rasti.
neigti paverčia operandą į priešingą.
Palyginimas išsamiai paaiškintas taip:
PalygintiĮ

public int compareTo(BigInteger val)

    Palyginkite šį BigInteger su nurodytu BigInteger. Šis metodas yra tinkamiausias kiekvienam iš šešių Bulio logikos palyginimo operatorių (<, ==, >, >=, !=, <=). Siūlomas teiginys šiems palyginimams atlikti yra: (x.compareTo(y) <op> 0), kur yra <op> vienas iš šešių palyginimo operatorių.

     

    Specifikatorius:
        sąsaja<BigInteger> Palyginama

    Parametrai:
        val - BigInteger, kuris lygina šį BigInteger su juo.
    Nugara:

   
  Pavadinimas Tikslių slankiojo kablelio skaičių skaičiavimų įgyvendinimas Java AYellow (originali) modifikacija           
  Raktažodžiai Java slankiojo kablelio skaičiaus tikslus skaičiavimas         
   
   
  Klausimas:   
  Ką pamatytume, jei sukompiliuotume ir paleistume šią programą?   
  viešosios klasės testas{   
          public static void main(String args[]){   
                  System.out.println(0.05+0.01);   
                  System.out.println(1.0-0.42);   
                  System.out.println(4.015*100);   
                  System.out.println(123.3/100);   
          }   
  };   
   
  Perskaitėte teisingai! Rezultatas iš tiesų yra   
  0.060000000000000005   
  0.5800000000000001   
  401.49999999999994   
  1.2329999999999999   
   
  Paprastų plūduriuojančių ir dvigubų tipų "Java" valdyti negalima. Ši problema yra ne tik "Java", bet ir daugelyje kitų programavimo kalbų. Daugeliu atvejų skaičiavimai yra tikslūs, tačiau galite pabandyti dar kelis kartus (galite padaryti kilpą) ir išbandyti tokias klaidas kaip aukščiau. Dabar pagaliau suprantu, kodėl yra BCD kodas.   
  Ši problema yra gana rimta, jei turite 9,99999999999999999 juanių, jūsų kompiuteris nemanys, kad galite nusipirkti 10 juanių prekių.   
  Kai kurios programavimo kalbos pateikia specializuotus valiutų tipus, kad galėtų susidoroti su šia situacija, tačiau "Java" to nedaro. Dabar pažiūrėkime, kaip tai išspręsti.   
   
      
   
  Apvalinimas   
  Pirmoji mūsų reakcija yra apvalinimas. Apvalaus metodo matematikos klasėje negalima nustatyti taip, kad būtų keli skaičiai po kablelio, galime tai padaryti tik (palikti dvi vietas):   
  viešas dvigubas raundas (dviguba reikšmė){   
          grąžinti Math.round(reikšmė*100)/100.0;   
  }   
   
  Deja, aukščiau pateiktas kodas neveikia, perduodant 4.015 į šį metodą bus grąžintas 4.01, o ne 4.02, kaip matėme aukščiau   
  4.015*100=401.49999999999994   
  Todėl, jei norime tiksliai suapvalinti, negalime naudoti paprastų tipų jokioms operacijoms atlikti   
  java.text.DecimalFormat taip pat neišsprendžia šios problemos:   
  System.out.println(naujas java.text.DecimalFormat("0.00").format(4.025));   
  Išvestis yra 4,02   
   
      
   
  Didžioji dešimtainė   
  Šis principas taip pat paminėtas knygoje "Efektyvi Java", plūduriuojantis ir dvigubas gali būti naudojami tik moksliniams ar inžineriniams skaičiavimams, o verslo skaičiavimuose turime naudoti java.math.BigDecimal. Yra 4 būdai, kaip sukurti "BigDecimal", mums nerūpi du, kurie yra sukurti naudojant "BigInteger", todėl yra dar du, kurie yra:   
  BigDecimal(dvigubas val)     
                      Dvigubą vertę paverčia BigDecimal.     
  BigDecimal(Eilutės val.)     
                      Išverčia BigDecimal eilutės reprezentaciją į BigDecimal.   
   
  API yra trumpai aprašyta ir paprastai yra lengviau naudojama. Mes galime jį naudoti net negalvodami apie tai, kokia bus problema? Kai kažkas nutiko, sužinojau, kad išsamiame aprašyme yra tokia pastraipa, kurios iš aukščiau išvardytų metodų pakanka:   
  Pastaba: šio konstruktoriaus rezultatai gali būti šiek tiek nenuspėjami.   Galima manyti, kad naujas BigDecimal(.1) yra lygiai lygus .1, bet iš tikrųjų jis yra lygus .1000000000000000055511151231257827021181583404541015625.   Taip yra todėl, kad .1 negali būti tiksliai pavaizduotas kaip dvigubas (arba kaip bet kokio baigtinio ilgio dvejetainė trupmena).   Taigi, ilgoji vertė, kuri perduodama konstruktoriui, nėra tiksliai lygi .1, nepaisant išvaizdos.     
  Kita vertus, (String) konstruktorius yra visiškai nuspėjamas: naujas BigDecimal(".1") yra lygiai lygus .1, kaip ir galima tikėtis.   Todėl paprastai rekomenduojama naudoti (eilutės) konstruktorių, o ne šį.   
   
  Pasirodo, jei mums reikia tiksliai apskaičiuoti, turime naudoti eilutę, kad sukurtume BigDecimal! Knygos "Effective Java" pavyzdyje "BigDecimal" sukurti naudojama eilutė, tačiau knygoje to nepabrėžiama, o tai gali būti nedidelė klaida.   
      
   
  Sprendimas   
  Dabar, kai išsprendėme šią problemą, principas yra naudoti "BigDecimal" ir būtinai naudoti eilutę.   
  Bet įsivaizduokite, jei norime atlikti sudėjimo operaciją, pirmiausia turime konvertuoti du slankiojo kablelio skaičius į eilutę, tada sukurti BigDecimal, iškviesti pridėjimo metodą viename iš jų, perduoti kitą kaip argumentą ir konvertuoti operacijos rezultatą (BigDecimal) į slankiojo kablelio skaičių. Ar galite ištverti tokį varginantį procesą? Žemiau pateikiame įrankių klasę Arith, kad supaprastintume operaciją. Jis siūlo šiuos statinius metodus, įskaitant sudėjimą, atimtį, daugybą ir dalijimą bei apvalinimą:   
  Viešasis statinis dvigubas pridėjimas (dvigubas v1, dvigubas v2)   
  viešasis statinis dvigubas antrinis (dvigubas v1, dvigubas v2)   
  Viešasis statinis dvigubas MUL (dvigubas V1, dvigubas V2)   
  Viešasis statinis dvigubas div (dvigubas V1, dvigubas V2)   
  Viešasis statinis dvigubas div (dvigubas V1, dvigubas V2, INT skalė)   
  Viešas statinis dvigubas apvalus (dviguba V, INT skalė)   
   
   
   
  Priedėlis   
   
   
  Šaltinio failo Arith.java:   
   
  importuoti java.math.BigDecimal;   
  /**   
    * Kadangi paprasti "Java" tipai negali tiksliai atlikti slankiojo kablelio operacijų, ši įrankių klasė numato baudas   
    * Tikslios slankiojo kablelio operacijos, įskaitant sudėjimą, atimtį, daugybą, dalijimą ir apvalinimą.   
    */   
   
  viešoji klasė Arit{   
   
          Numatytasis padalijimo operacijos tikslumas   
          privatus statinis galutinis int DEF_DIV_SCALE = 10;   
   
   
          Šios klasės negalima sukurti   
          privatus Arith(){   
          }   
   
      
          /**   
            * Užtikrina tikslias pridėjimo operacijas.   
            * Pridėta @param v1   
            * @param v2 papildymas   
            * @return Dviejų parametrų suma   
            */   
   
          viešasis statinis dvigubas add(dvigubas v1, dvigubas v2){   
                  BigDecimal b1 = naujas BigDecimal(Double.toString(v1));   
                  BigDecimal b2 = naujas BigDecimal(Double.toString(v2));   
                  grąžinti b1.add(b2).doubleValue();   
          }   
   
          /**   
            * Užtikrina tikslias atimties operacijas.   
            * @param v1 atimamas   
            * @param v2 minus   
            * @return Skirtumas tarp dviejų parametrų   
            */   
   
          viešasis statinis dvigubas sub(dvigubas v1, dvigubas v2){   
                  BigDecimal b1 = naujas BigDecimal(Double.toString(v1));   
                  BigDecimal b2 = naujas BigDecimal(Double.toString(v2));   
                  grąžinti b1.subtract(b2).doubleValue();   
          }     
   
          /**   
            * Užtikrina tikslias daugybos operacijas.   
            * @param v1 padauginamas   
            * @param v2 daugiklis   
            * @return Dviejų parametrų sandauga   
            */   
   
          viešasis statinis dvigubas MUL(dvigubas v1, dvigubas v2){   
                  BigDecimal b1 = naujas BigDecimal(Double.toString(v1));   
                  BigDecimal b2 = naujas BigDecimal(Double.toString(v2));   
                  grąžinti b1.multiply(b2).doubleValue();   
          }   
   
      
   
          /**   
            * Teikia (santykinai) tikslias padalijimo operacijas, kai neišsemiamas padalijimas įvyksta   
            * 10 skaitmenų po kablelio, o tolesni skaitmenys suapvalinti.   
            * @param v1 yra padalintas   
            * @param V2 daliklis   
            * @return Dviejų parametrų koeficientas   
            */   
   
          viešasis statinis dvigubas div (dvigubas v1, dvigubas v2){   
                  return div(v1,v2,DEF_DIV_SCALE);   
          }   
   
      
   
          /**   
            * Teikia (santykinai) tikslias padalijimo operacijas. Kai susidaro neišsemiama situacija, tai rodo skalės parametras   
            * Nustatykite tikslumą, ir skaičiai po jo bus suapvalinti.   
            * @param v1 yra padalintas   
            * @param V2 daliklis   
            * @param skalė rodo, kad ji turi būti tiksli iki kelių skaičių po kablelio.   
            * @return Dviejų parametrų koeficientas   
            */   
   
          viešasis statinis dvigubas div (dvigubas v1, dvigubas v2, int skalė){   
                  if(skalė<0){   
                          mesti naują IllegalArgumentException(   
                                  "Skalė turi būti teigiamas sveikasis skaičius arba nulis");   
                  }   
                  BigDecimal b1 = naujas BigDecimal(Double.toString(v1));   
                  BigDecimal b2 = naujas BigDecimal(Double.toString(v2));   
                  grąžinti b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
          }   
   
      
   
          /**   
            * Užtikrina tikslų dešimtainį apvalinimą.   
            * @param v reikia suapvalinti skaičius   
            * @param skalė rezervuojama po kablelio   
            * @return Suapvalinti rezultatai   
            */   
   
          viešas statinis dvigubas apvalus (dvigubas v, int skalė){   
                  if(skalė<0){   
                          mesti naują IllegalArgumentException(   
                                  "Skalė turi būti teigiamas sveikasis skaičius arba nulis");   
                  }   
                  BigDecimal b = naujas BigDecimal(Double.toString(v));   
                  BigDecimal one = naujas BigDecimal("1");   
                  return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
          }   
  };




Ankstesnis:Geriausia nenustatyti eilutės, kurios reikšmė yra pirminis raktas
Kitą:JDK, JRE, JVM skirtumai ir ryšiai
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com