Programuojant Java kalba galima susidurti su tokia situacija, kai atliekant dalybos operaciją gaunate tam tikrą rezultatą, kurio formatą norima pakeisti į trumpesnį, nes gautasis rezultatas per ilgas. Tarkime atliekamas dalybos veiksmas su dviem float tipo skaičiais: (float) 1 / (float) 3, rezultatas 0.33333334. Double tipo skaičiams gautume: (double) 1 / (double) 3, rezultatas dar ilgesnis 0.3333333333333333.
Taigi, dažnai toks rezultatas netenkina, nes yra per ilgas. Tarkime, kad reikia pateikti rezultatą dviejų skaičių po kablelio tikslumu.
Tai padaryti galima įvairiai. Pateiksime keletą pavyzdžių.
Bene lengviausias būdas būtų parašyti:
float a = (float) 1 / (float) 3; double b = (double) 1 / (double) 3; System.out.format("Float tipo skaičius %.2f%n", a); System.out.format("Double tipo skaičius %.2f", b);
%2f - reiškia kad realusis skaičius pateikiamas dviejų skaičių po kablelio formatu
%n - naujos eilutės simbolis žymintis, naują eilutę
a - float tipo rezultatas
b - double tipo rezultatas
Rezultatas:
Tą patį galima gauti ir panaudojant DecimalFormat (java.text.DecimalFormat) klasę. Kad pasinaudotume jos galimybėmis kodo pradžioje, reikia nepamiršti įrašyti import java.text.*; Ši klasė turi labai plačias galimybes.
Taigi pasinaudoti DacimalFormat galimybėmis galima naudojant tokį metodą:
public void customFormat(String pattern, float value) { DecimalFormat dForm = new DecimalFormat(pattern); // sukuriamas klasės objektas pattern formato String output = dForm.format(value); // String tipo kintamajam priskiriama format(value) reikšmė System.out.println(output); // rezultatas išvedamas į ekraną } // String pattern - String tipo kintamasis apibrėžiantis rezultato formatą. // float value - float tipo kintamasis iš kurio formuojamas rezultatas. // float value pakeisti double value - jei skaičiuojama double tipo kintamajam
Toliau kreiptis į šį metodą galima taip:
customFormat("#.##", a);
# nurodo kad reikia naudoti tikrines reikšmes prieš ir po kablelio
Rezultatas:
0,33
Norint perduoti b kaip parametrą, reikia pakeisti ‘float value’ į ‘double value’
Verta paminėti, kad “#.##” pakeitus “0.00″ rezultatas gaunamas analogiškas, tačiau ne visada.
customFormat("00.00", a);
Rezultatas įgautų tokį pavidalą:
00,33.
o
customFormat("##.##", a);
Rezultatas:
0,33
Taigi reikia atsiminti, jog # ir 0 reikšmės skirtingos.
Kiek kitaip yra, jeigu norime ne išvesti į ekraną gautą rezultatą, bet double tipo kintamajį b priskirti kitam double tipo kintamajam c, tik jau ne 0.3333333333333333 pavidale, o 0.33. Tam aukščiau aptarti būdai netinka. Kaip vieną iš problemos sprendimo būdų galima naudoti tokį metodą:
public double formatas( double d, int dp ) { double x= Math.pow( 10, dp ) ; return( Math.round( d * x) / x) ; } // double d tai skaičius, kuris bus formuojamas, // int dp - kiek skaičių po kabelio turės suformuotas rezultatas
Priskirti galėtume šitaip:
double c = formatas(b, 2);
Jeigu b = 0.3333333333333333, tai c = 0.33. Taigi gaunamas double tipo kintamasis c, kurio reikšmę galima tiek išspausdinti į ekraną, tiek panaudoti skaičiavimuose.
Be abejonės be čia pateiktų pavyzdžių galima sugalvoti ir kitokių būdų minėtoms problemoms spręsti, o tiems kas nenori galvoti savo, tiesiog gali naudoti pateiktus.
2007-02-05 | 8:32
parašyk programą, kur su java reikia sudėti du skaičius įvestus klaviatūrą
2007-02-05 | 9:10
float ir double tipai labai retai kur pritaikomi. Jų negalima naudoti ten, kur reikia tikslaus rezultato (pvz. skaičiuoti kainą). Tam yra BigDecimal (ir giminingi) tipai, ir jų formatavimas visai kitaip organizuojamas.
2007-02-13 | 10:45
O pagal ka java nustato, kad sveikąją dalį atskirti kableliais, o ne taškais?