03. december 2011 - 00:20Der er
12 kommentarer og 1 løsning
Afrund til 4 decimaler
Hejsa
Et hurtigt spørgsmål - jeg har en del double værdier der skal afrundes. Jeg har i andre tråde fundet frem til arne_vs svar for at afrunde til 2 decimaler via: double d = 1.23213; double d2 = ((int)(100*d+0.5))/100.0;
Men hvad gør man, hvis man gerne vil have 4 decimaler?
Arne -> Jeg har forsøgt at uppe den til 3 sådan her:
double d2 = ((int)(1000*d+0.5))/100.0;
Men altså - det rykker kommaet så min tal der er 382,209 bliver til 382,21 med 100. Med 1000 bliver den til 3822,09... Jeg vil helst ikke rykke kommaet :)
Næste spørgsmål, som jeg meget gerne vil addere på denne her - nogen gange bliver mine doubles til Infinity? Hvad betyder det? Det sker ofte når jeg har divideret to tal... Hvordan kan man begrænse den? Hvis jeg prøver at køre den igennem afrunding til to decimaler ender den med at se sådan her ud: 2.147483647E7
Hov, jeg tror faktisk jeg har en løsning. Jeg prøvede at dividere med et tal fra databasen, som ikke eksisterer - så jeg prøver nok at dividere med 0,00. Så mit reelle spørgsmål er stadig: Hvad er infinity i en double?
OG hvordan får jeg rundet af til tre/fire/fem decimaler på mine doubles?
Hvis du vil have et tal afrundet til præcis x decimaler, skal du bruge BigDecimal i stedet for double. Og hvis det bare er i forbindelse med at udskrive din double afrundet til x decimaler, så kan du bruge DecimalFormat i stedet (og du ønsker måske at ændre afrundingsmetoden til HALF_UP i stedet for HALF_EVEN som er default).
Et lille eksempel der viser at en double ikke kan afrundes til præcis x antal decimaler:
double d = 0.1; BigDecimal b = new BigDecimal(0.1); System.out.println(b);
Men det kommer an på i hvilken sammenhæng du gerne vil have dit resultat afrundet, så hvis double giver dig den præcision du har brug for, så er arne's metode helt fin.
Altså den usikkerhed der findes er vel så lille, at den er djævelsk ligegyldig? Sådan ser jeg lidt på det... Men tak for udpenslingen Tolamaps... Jeg må indrømme, at jeg har prøvet DecimalFormat og BigDecimal måtte jeg give op på, prøvede ellers dem her:
floating point som double boer kun bruges naar man kan acceptere en vis usikkerhed.
Din bogholder bliver ikke glad hvis du siger at du har mellem 5.0999999999999999 og 5.1000000000000001 kroner i kassen - han vil foretraekke 5.10.
Men om din afstand til arbejde er 5.0999999999999999 eller 5.1000000000000001 km til arbejde har jo ikke nogen praktisk betydning - der er alligevel mange meters usikkerhed omkring hvor man maaler fra og til.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.