Šta je novo?

Pretvaranje niza u cijeli broj daje pogrešan rezultat

NamanRathore

Flash Drive
Učlanjen(a)
11.07.2022
Poruke
4
Poena
1
U svom programu objavljujem vrijednost iznosa uplate kontroleru i pretvaram tu vrijednost u Integer. Budući da ovu vrijednost želim pretvoriti u cente prije poziva web usluge. Koristim Javu i pretvaram String u Integer kod naveden ispod

Kod:
(int)(Double.parseDouble(httpRequest.getParameter(PAYMENT_AMOUNT).trim()) * 100);

Output is

Kod:
Payment Amount: <input type="text" id="paymentAmount" name="paymentAmount" value="1.00" />

Za većinu ulaznih vrijednosti daje točan rezultat.
Ali za neke vrijednosti kao što je 8.03 kao ulaz, vraća 802 kao izlaznu vrijednost. To se događa u 9.03, 9.04, 10.03, 10.04, 11.03 itd.
koje bi moglo biti opravdanje za ovaj problem? Prije ovoga, također sam prošao kroz neke članke o nizu do cijelog broja u Javi Scaler, wiki i neki drugi izvori također na StackOverflow i Quora.
 

voodoo_

3.5" Floppy
Učlanjen(a)
31.08.2003
Poruke
9,694
Poena
38
Float/double operacije pate od grešaka u zaokruživanju, ima na internetu naširoko od čega to potiče i kako se oni predstavljaju u memoriji, zato ih treba izbegavati za finansije.

U ovom konkretnom slučaju, ako nećeš da koristiš BigDecimal, seljačka varijanta bi bila da proveriš da li ulaz sadrži tačku i da ga u tom slučaju splituješ po tački i uradiš dve konverzije.

Java:
String param = httpRequest.getParameter(PAYMENT_AMOUNT).trim();
int value;

if (param.contains(".")) {
    String[] split = param.split("\\.");  // Za ulaz "8.01", dobićeš niz od dva stringa, "8" i "01"
    value = 100 * Integer.parseUnsignedInt(split[0]) + Integer.parseUnsignedInt(split[1]);
} else {
    value = 100 * Integer.parseUnsignedInt(param);
}
 
Vrh Dno