Es gribētu metodi, kas pārvērš divkāršu skaitli virknē, kas noapaļo, izmantojot metodi "noapaļošana uz pusi uz augšu", t. i., ja noapaļojamā decimālzīme ir 5, tā vienmēr noapaļo līdz nākamajam skaitlim. Tā ir standarta noapaļošanas metode, ko vairums cilvēku sagaida lielākajā daļā situāciju.
Es arī vēlētos, lai tiktu parādīti tikai zīmīgie cipari, t. i., lai nebūtu nekādu nullīšu.
Zinu, ka viena no metodēm, kā to izdarīt, ir izmantot String.format
metodi:
String.format("%.5g%n", 0.912385);
atgriež:
0.91239
kas ir lieliski, tomēr tas vienmēr parāda skaitļus ar 5 zīmēm aiz komata, pat ja tie nav būtiski:
String.format("%.5g%n", 0.912300);
atgriežas:
0.91230
Cita metode ir izmantot DecimalFormatter
:
DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);
atgriež:
0.91238
Tomēr, kā redzat, šajā gadījumā tiek izmantota puslīdz vienāda noapaļošana. Tas nozīmē, ka tas noapaļo uz leju, ja iepriekšējais cipars ir pāra skaitlis. Es gribētu, lai būtu šādi:
0.912385 -> 0.91239
0.912300 -> 0.9123
Kāds ir labākais veids, kā to panākt ar Java?
Izmantojiet setRoundingMode
, skaidri iestatiet RoundingMode
, lai risinātu jūsu problēmu ar puslīdz vienādiem apaļumiem, pēc tam izmantojiet formāta paraugu vajadzīgajam izvades veidam.
Piemērs:
DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
Double d = n.doubleValue();
System.out.println(df.format(d));
}
dod rezultātu:
12
123.1235
0.23
0.1
2341234.2125
EDIT: Sākotnējā atbildē nav aplūkota dubulto vērtību precizitāte. Tas ir labi, ja jums ir vienalga, vai noapaļo uz augšu vai uz leju. Bet, ja vēlaties precīzu noapaļošanu, tad jāņem vērā vērtību paredzamā precizitāte. Vērtībām ar peldošo komatu ir bināra iekšējā atveidošana. Tas nozīmē, ka tādai vērtībai kā 2,77395 patiesībā nav precīzas iekšējās vērtības. Tā var būt nedaudz lielāka vai nedaudz mazāka. Ja iekšējā vērtība ir nedaudz mazāka, tad tā netiks noapaļota līdz 2,7740. Lai labotu šo situāciju, jums jāapzinās, ar kādu precizitāti ir vērtības, ar kurām strādājat, un pirms noapaļošanas jāpievieno vai jāatņem šī vērtība. Piemēram, ja jūs zināt, ka jūsu vērtības ir precīzas līdz 6 cipariem, tad, lai noapaļotu vērtības uz pusi uz augšu, pieskaitiet šo precizitāti vērtībai:
Double d = n.doubleValue() + 1e-6;
Lai noapaļotu uz leju, atņemiet precizitāti.
Pieņemot, ka vērtība
ir divāds
, var veikt:
(double)Math.round(value * 100000d) / 100000d
Tas ir 5 ciparu precizitāte. Nulu skaits norāda decimāldaļu skaitu.