Avatar billede anders_cp Nybegynder
22. juli 2010 - 13:42 Der er 3 kommentarer og
1 løsning

afrunding

Hejsa
Dette burde være nemt (håber jeg)
decimal test1 = System.Math.Round(5.764M, 2); // 5,76

SKAL GIVE 5,77
decimal test2 = System.Math.Round(5.765M, 2); //5,76


decimal test3 = System.Math.Round(-3.368M, 2); // -3,37
decimal test4 = System.Math.Round(5.368M); // 5
decimal test5 = System.Math.Round(0.768M); //1

Som det ses laves afrundingsfejl på test 2

Er der nogen nogen som kan hjælpe mig med denne lille ting, som dog er meget vigtig for mig?
Avatar billede Syska Mester
22. juli 2010 - 14:38 #1
http://msdn.microsoft.com/en-us/library/75ks3aby.aspx

Eksemplet på MSDN siger at det skal være sådan:
Math.Round(3.44, 1) 'Returns 3.4.
Math.Round(3.45, 1) 'Returns 3.4.
Math.Round(3.46, 1) 'Returns 3.5.

Math.Round(4.34, 1) ' Returns 4.3
Math.Round(4.35, 1) ' Returns 4.4
Math.Round(4.36, 1) ' Returns 4.4

Så ved ikke om de på den anden side af verden gør det på en anden måde, men i hvert fald mærkeligt.

http://da.wikipedia.org/wiki/Afrunding
Wiki giver også samme svar som jeg ville formode,men det virker ikke som en fejl, efter deres eksempler, men plat og mærkeligt, det må jeg give dig ret i ...

Og lidt mere googling siger noget andet ....
http://en.wikipedia.org/wiki/Rounding#Round_half_up

sjovt som man kan blive klogere ...

            decimal test1 = System.Math.Round(5.765M, 2); //5,76
            decimal test2 = System.Math.Round(5.7651M, 2); //5,76

test2 giver det rigtige :-)

mvh
Avatar billede anders_cp Nybegynder
22. juli 2010 - 14:51 #2
jo, jeg har allerede været dine links igennem. MSDN kalder afrundingen for "banker's rounding", men dit danske http://da.wikipedia.org/wiki/Afrunding siger faktisk det rigtige, altså at:
12,165 ~ 12,17 - Fordi 5 er 5 og skal derfor rundes op.

hvorfor test2 skal give
5,77
decimal test2 = System.Math.Round(5.7651M, 2); //5,76

Dette stemmer jo overens med at
0-4 rundes NED
og 5-9 rundes OP


Så der er måske ikke andet at gøre end selv at lave en funktion til afrunding?
Avatar billede Syska Mester
22. juli 2010 - 15:10 #3
Nej, faktisk ik' ... tror ikke man kan gøre så meget ved det når MSDN selv siger det skal være sådan.

Men hvad afrundings model de bruger ved jeg ikke lige. Ved tie-break runder de ned, dvs de kigger på næste tal, som i test1 er 0 og test2 er 1 ... og derfor virker det med 2'eren.

Men ... se her, en overload:
decimal test1 = System.Math.Round(5.765M, 2, MidpointRounding.AwayFromZero);

Giver det rigtige ved mig ... og minder mig om at jeg også kunne ske at have en bug i noget gammel kode :-)

mvh
Avatar billede anders_cp Nybegynder
22. juli 2010 - 15:41 #4
Lækkert. Din overload ser ud til at virke :-)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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