Kā noapaļot skaitli līdz n zīmēm aiz komata Java programmā

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?

Risinājums

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.

Komentāri (9)

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.

Komentāri (22)
double myNum = .912385;
int precision = 10000; //keep 4 digits
myNum= Math.floor(myNum * precision +.5)/precision;
Komentāri (2)