Avatar billede Jonas Nybegynder
03. december 2011 - 00:20 Der 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?
Avatar billede arne_v Ekspert
03. december 2011 - 00:25 #1
Bruger 10000 frmfor 100.
Avatar billede vagnk Juniormester
03. december 2011 - 09:18 #2
Avatar billede Jonas Nybegynder
03. december 2011 - 13:12 #3
Vagn -> Jeg søger et svar for java, ikke php :)

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 :)
Avatar billede Jonas Nybegynder
03. december 2011 - 14:33 #4
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

Hvordan kan jeg undgå det?
Avatar billede Jonas Nybegynder
03. december 2011 - 14:37 #5
Og kigger jeg i databasen, så opdaterer den med:
21474836.47

Selvom det korrekte i virkeilgheden ville være noget lig 0.00... (et meget lavt tal!)
Avatar billede Jonas Nybegynder
03. december 2011 - 14:40 #6
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?
Avatar billede arne_v Ekspert
03. december 2011 - 15:56 #7
double d2 = ((int)(10000*d+0.5))/10000.0;
Avatar billede arne_v Ekspert
03. december 2011 - 15:57 #8
infinity = uendelig

ogsaa kendt som det liggende otte tal
Avatar billede Slettet bruger
03. december 2011 - 23:51 #9
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);

Output:
0.1000000000000000055511151231257827021181583404541015625

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.
Avatar billede Jonas Nybegynder
06. december 2011 - 20:49 #10
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:


        //BigDecimal bd = new BigDecimal(d);
        //bd.setScale(1, BigDecimal.ROUND_HALF_UP);
        //String formatted = bd.toString();
        //d = Double.valueOf(formatted);

        //DecimalFormat twoDForm = new DecimalFormat("#.##");
        //return Double.valueOf(twoDForm.format(d));

Fejlen kom vist fordi mine doubles pludselig viste Infinity. Aner ikke hvorfor. Jeg dividerede blot to med hinanden...


Arne smider du et svar? :)
Avatar billede arne_v Ekspert
06. december 2011 - 21:28 #11
divison med 0 giver INF
Avatar billede arne_v Ekspert
06. december 2011 - 21:32 #12
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.
Avatar billede arne_v Ekspert
06. december 2011 - 21:32 #13
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester