JavaRush /Java Blog /Random-TK /Java-da tegelek sanlar

Java-da tegelek sanlar

Toparda çap edildi
Floüzýän nokat sanlary (ýüzýän, goşa) onluk takyklygy talap edýän aňlatmalary hasaplanda ulanylýar. Hasapçylyk we beýleki hasaplaýyş amallarynda ýokary takyklyk köplenç zerurdyr. Java-da tegelek sanlar - 1Emma onluk nokatdan soň elmydama uzyn “guýruk” gerekmi? Üç hakyky bölekleriň takyklygy bize ýeterlikdir? Bu wariant bilen kanagatlansak, tegelegi nädip dogry ýerine ýetirmeli? Edil şu gün gürleşjek zadymyz: Java-da sanlary tegeleklemegiň usullaryna serederis .

Setir formaty

Ilkinji usul hökmünde goşa tegelege serederis:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
Netijede, 34766674 ýüzýän nokadymyzy 3 onluk ýeriň takyklygy bilen formatlarys , sebäbi formatlaşdyryş görkezmelerinde üç onluk ýeri kesgitledik "% .3f. Öz gezeginde, setir formatlananda% f ýüzýän nokadyň görnüşini görkezýär. Maglumatlaryň görnüşini goşa we Java-da ýüzýän sanlary öz içine alýan sanlar . aboveokardaky mysalda, çykarylan bahany konsola çykarýarys. Indi sorag: muny nädip gysgaldyp bileris? Bu ýönekeý: printf ulanmaly, bu bolsa öz gezeginde format + çapdyr. Netijede, öňki mysalymyz azaldar:
double value = 34.766674;
System.out.printf("%.3f",value);
Bu usuldan başga-da, “PrintStream” synpynyň daşky görnüşinde hem şuňa meňzeş işleýän format usuly bar:
double value = 34.766674;
System.out.format("%.3f",value);
Tegeleklik HALF_UP re modeiminde - kesilenine has ýakyn sana (0 ýa-da 10-a çenli) bolýar. Bu sanlar deň bolsa (5 ýagdaýynda), onda tegelek ýerine ýetirilýär. Mysal:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
Tegelek usullaryny aşakda has jikme-jik ara alyp maslahatlaşarys. Java-da tegelek sanlar - 2

“DecimalFormat”

Başga bir wariant, “DecimalFormat” synpyny ulanmak . Java-da islendik san, bitewi ýa-da ýüzýän nokat bolsun, formatlamak üçin döredildi. “DecimalFormat” -y dessine ulananymyzda , ony format setirinden geçirip bileris. Giriş üçin näçe onluk ýerleri formatlamalydygyny görkezer. “DecimalFormat” -y ulanmagyň mysaly şu :
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
#. ### setir , geçen bahany 3 onluk ýere formatlaýandygymyzy görkezýän nagyş. “DecimalFormat” obýekti döredilenden soň nagşy üýtgetmek üçin, onuň “AppPattern” -i ulanyp we “LokalizirlenenPattern” usullaryny ulanyp bilersiňiz :
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
Todayöne bu gün tegeleklemek hakda gürleşýäris, şeýlemi? Bellenen nagyşdan daşgary onluk ýerler bilen bir san kesilende, iň soňky kesilen san 5-den köp bolsa, “DecimalFormat” sanlary tegelekleýär, ýöne san 5 bolsa näme etmeli? Görnüşi ýaly, iň ýakyn bitewi sanlaryň arasynda. Onda näme? Bu ýagdaýda öňki san göz öňünde tutulýar. Eger deň bolsa, tegelek edilýär:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
Geň bolsa, ýerine ýetirilmeýär:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
String.format () we DecimalFormat.format () ulanyp, ýüzýän nokat sanlaryny formatlamagyň arasynda azajyk tapawut bar. Birinjisi, bölekleýin bölek bolmasa-da, yzky nollary elmydama çap eder. Mysal üçin:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
Görşümiz ýaly, 7.000132 belgisini üç onluk ýere format edeniňizde, String formaty () usuly 7.000 çykar, DecimalFormat formaty () usuly bolsa 7 çykar, ýagny String.format () ýa-da DecimalFormat formatyny saýlap bilersiňiz. ) yzky nollaryň gerekdigine ýa-da ýokdugyna baglylykda. Aboveokarda beýan edilen usullary ulanyp, netijäni setir görnüşinde aldyk. Geliň, san bahalaryny takyk yzyna almagyň ýollaryna seredeliň.

Matematika

Sanlar bilen dürli arifmetiki amallar üçin taýýarlanan ýörite synpy agzamak mümkin däl . Java-da tegelek sanlar - 3Bu synpda tegeleklemegiň usullary hem bar, ýöne eýýäm beýan edilenlerden tapawutlylykda, belli bir mukdarda onluk ýerleri bellemäge rugsat bermeýär, tersine, bitewi bir tegelek:
  • Math.ceil () iň ýakyn bitewi sanlara çenli tegelek, ýöne bitewi görnüşi däl-de, iki esse gaýtarýar:

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    34.0000000 bar bolsa-da, Math.ceil ulananymyzdan soň 35.0 alarys.

    Math.floor () iň ýakyn bitewi sanlara aýlanýar we netijäni iki esse gaýtaryp berýär:

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    Againene-de 34.999999999 bahasy bar bolsa-da, Math.floor ulananymyzdan soň 34.0 alarys.

  • Math.round () - iň ýakyn bitewi sanlara tegelek, netijäni int:

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    Eger-de biziň sanymyz 34.5 bolsa, 35-e tegelek, ýöne 34.499-dan birneme az bolsa, san 34-e çenli kesilýär.

    Diňe hakyky bölegini kesmek däl-de, bu prosesi belli bir mukdarda onluk ýerlere we şol bir wagtyň özünde tertipleşdirmek üçin san 10 ^ n (n güýjüne 10) köpeldilýär, bu ýerde n zerur onluk ýerleriň sanyna deňdir. Ondan soň, Matematika synpynyň käbir usuly tegeleklemek üçin ulanylýar we soňra ýene 10 ^ n bölünýär:

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow - iki argument alýar. Birinjisi san, ikinjisi ony ýokarlandyrmaly güýç.

BigDecimal bilen tegelek

“BigDecimal” ýüzýän nokatlar bilen işlemäge mümkinçilik berýän synpdyr. Hususan-da, onuň esasy aýratynlygy, özbaşdak uzynlygyň fraksiýa sanlaryny saklamagydyr (ýagny, san aralygynda hiç hili çäklendirme ýok). Mundan başga-da, bu synp arifmetiki gaýtadan işlemegiň dürli usullaryny, şol sanda tegeleklemäni saklaýar. Bu obýektiň synpy, konstruktory iki esse, ýüzýän nokat sanyny görkezmek üçin setir, goşa we MathContext we ş.m. düzmek arkaly döredilip bilner . “MathContext” “RoundingMode” bilen gözlenýän bahadaky sanlaryň umumy sanyny suratlandyrýan san . Tegelek düzgünleri Tegelek tertibi: DOWN - nola tarap tegelek. UP - nol re fromimde. CEILING - polo positiveitel çäksizlige tarap tegelek. GÜL - negatiw çäksizlige tarap tegelek. HALF_UP - Iki goňşy deň bolmasa (ýagny, tegeleklenen san 5 bolanda) "iň ýakyn goňşy". Bu ýagdaýda tegeleklemek amala aşyrylýar. HALF_DOWN - “iň ýakyn goňşymyza” tegelek. Iki goňşy-da deň däl bolsa, bu ýagdaýda aşak düşüň. HALF_EVEN - Iki goňşy deň bolmasa, "iň ýakyn goňşy". Bu ýagdaýda hatda goňşusyna tegelek (ýokarda beýan edilişi ýaly “DecimalFormat” -da). UNNECESSARY - Talap edilýän amalyň dogry netijesini tassyklamak üçin ulanylýar. Şonuň üçin tegeleklemek hökman däl. Mysal:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
Konstruktordaky tegelek düzgüni düzmek ukybyna goşmaça, BigDecimal mysal döredilenden soň tegelek re modeimini düzmäge mümkinçilik berýär. Munuň üçin onluk ýerleriň sanyny we tegelek düzgünlerini bellemeli setScale usulyny ulanyň:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
“BigDecimal” -da tegelek re modeimini düzmek üçin döredilen içerki int üýtgeýjileri hem bar ( ROUND_DOWN , ROUND_CEILING , ROUND_FLOOR ...) Bular “RoundingMode” synpynda görkezilenlere meňzeş tegelek düzgünler we setScale -de birmeňzeş ulanylýar :
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
BigDecimal synpy barada has giňişleýin okaň .
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION