Avatar billede HPCISCO Nybegynder
15. marts 2013 - 08:26 Der er 5 kommentarer og
1 løsning

Hvornår er det nødvendigt med round af double

Hej,

jeg har et program, hvor en double værdi hentes fra en ekstern kilde. Lad os sige at denne har værdien 23.3.

Hvis jeg så direkte efter at have læst værdien viser den som string i en Label, vil man typisk se noget a la 23.3000000032134...

Dette pga. manglende nøjagtighed med double.

For at få vist værdien korrekt kan man jo så først runde af som f.eks.:
value = Math.Round(value, 1, MidpointRounding.AwayFromZero)
før man viser værdien i Label'en.

Mit spørgsmål er nu følgende:
Hvis man nu "mellemlagrer" værdien i flere variabler inden man viser den, mistes præcisionen så ind imellem, så det er nødvendigt at runde af igen lige inden man viser værdien?

Eksempel:
double value1 = ReadValueFromExternalUnit();
label1.text = Convert.ToString(value1); //23.300002313
double value2 = Math.Round(value1, 1, MidpointRounding.AwayFromZero);
label1.text = Convert.ToString(value2); //23.3
double value3 = value2;
label1.text = Convert.ToString(value3); //??
double value4 = value3;
label1.text = Convert.ToString(value4); //??


På forhånd tak!
Avatar billede lasserasch Juniormester
15. marts 2013 - 09:28 #1
Altså hvis jeg forstår dit spørgsmål korrekt, så nej. Hvis du sætter en double variabel ud fra en afrundet double værdi fra en anden variabel, så vil den nye instans få den afrundede værdi.

F.eks.:


double val1 = 23.30034567;
double val2 = val1;
val1 = Math.Round(val1, 1);
double val3 = val1;


val1 vil nu være = 23.3.
val2 vil nu være = 23.30034567
val3 vil nu være = 23.3


Vh.
Lasse Rasch
Avatar billede arne_v Ekspert
16. marts 2013 - 22:42 #2
Efter min mening vil man aldrig have brug for at lave den type afrunding.

Brug af det er et tegn paa et grundliggende problem et sted i koden.
Avatar billede arne_v Ekspert
16. marts 2013 - 22:44 #3
Du giver ikke meget mulighed for at sige havd problemet er i din kode, men jeg vover at gaette paa at din ReadValueFromExternalUnit returnerer en float og ikke en double;
Avatar billede arne_v Ekspert
16. marts 2013 - 22:47 #4
Og:

double value1 = ReadValueFromExternalUnit();
double value2 = Math.Round(value1, 1, MidpointRounding.AwayFromZero);
label1.text = Convert.ToString(value2);

vil i alle normale tilfaelde laves som:

double value1 = ReadValueFromExternalUnit();
label1.text = value1.ToString("F1");
Avatar billede HPCISCO Nybegynder
19. september 2013 - 13:40 #5
>>arne_v
Du har ret i, at værdien oprindelig kommer som float,
så det er vel OK, at denne skal afrundes een gang?
Jeg tror lasserasch har svaret på det, at det kun er nødvendigt een gang. Lægger du svar?
Avatar billede lasserasch Juniormester
19. september 2013 - 13:48 #6
Hermed 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

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