31. marts 2005 - 09:54
Der er
33 kommentarer og 1 løsning
Afrundning med decimaler
Hejsa, Jeg skal have afrundet noget - i første omgang har jeg haft afrundet til hele tal evd følgende måde: Math.Round((antal / 3.32), 0) + " kroner"; Nu skal jeg have afrundet det med decimaler – som f.eks.: 0,9 -> 1 1.01 -> 1,25 1,12 -> 1,25 1,30 -> 1,50 1,55 -> 1,75 1,76 -> 2 osv. Altså, så der bliver rundet op til nærmeste mulige ørebeløb. Er der en, der kan hjælpe mig? Med venlig hilsen, Line
Annonceindlæg fra HP
31. marts 2005 - 10:42
#1
Når du har fat i Math.Round, så skal du lige være opmærksom på, at den benytter Bankers Rounding, hvilket ikke er det princip, der anvendes i Danmark. Bankers Rounding betyder, at der afrundes til nærmeste lige, dvs. 3.5 afrundes til 4, og 4.5 ligeledes bliver afrundet til 4, hvor vores matematiske princip betyder, at der 4,5 skal afrundes til 5.
31. marts 2005 - 10:44
#2
Jeg havde afrundingsproblemet i et program, og jeg løste det med denne klasse: public sealed class Math { public static double Round(double value, int digits) { string format = "F" + digits.ToString("F0"); string strValue = value.ToString(format); return double.Parse(strValue); } public static double Round(double value) { return Round(value, 0); } public static decimal Round(decimal value, int digits) { string format = "F" + digits.ToString("F0"); string strValue = value.ToString(format); return decimal.Parse(strValue); } public static decimal Round(decimal value) { return Round(value, 0); } }
31. marts 2005 - 10:56
#3
Et muligt bud: public double MathRound(double val) { double decimalVal = val % 1; double endVal = val - decimalVal; if(decimalVal >= 0 && decimalVal < 0.13) decimalVal = 0; else if(decimalVal >= 0.13 && decimalVal < 0.38) decimalVal = 0.25; else if(decimalVal >= 0.38 && decimalVal < 0.63) decimalVal = 0.5; else if(decimalVal >= 0.63 && decimalVal < 0.88) decimalVal = 0.75; else decimalVal = 1; return endVal + decimalVal; }
31. marts 2005 - 11:16
#4
Mit forslag: public static decimal SpecialRound(decimal x) { return ((decimal)((int)((x + 0.249m) * 4))) / 4; }
31. marts 2005 - 11:17
#5
mht bennytordrup's kommentar kan man også gøre således med afrunding: /// <summary> /// MathRound takes the double inparameter val and rounds it to a number of decimals /// dictated by the int inparameter decimals. /// </summary> public double RoundDouble(double val, int decimals) { double decimalPow = Math.Pow(10, decimals); int tempVal = (int)(val * decimalPow + 0.5); return tempVal / decimalPow; }//MathRound
31. marts 2005 - 11:25
#6
spif >> Uden at have prøvet din løsning, hvor mange decimaler håndterer den? SQL Server f.eks. returnerer ikke korrekt retultat ved 10 eller flere decimaler.
31. marts 2005 - 11:25
#7
øhmm.. Arne? 1.51 giver 1.75 med den metode...
31. marts 2005 - 11:29
#8
benny >> Det ved jeg faktisk ikke - brugte den for et års tid siden, men jeg havde ikke brug for så mange decimaler, men den kan vel laves om til at bruge decimal i stedet for double - det burde vel give lidt. Men du kan jo prøve at teste det... :)
31. marts 2005 - 11:54
#9
spif2001>> ja... ? hans krav var at runde OP til nærmeste øre-beløb. 51 øre, her er det 75 øre der er det nærmeste når man runder op.
31. marts 2005 - 11:56
#10
han = hun = han... nu skal jeg ikke komme med udtalelser om spørgerens køn, så lad os bare sige personen ;)
31. marts 2005 - 12:01
#11
ah - sorry - fik læst lidt for hurtigt ;)
31. marts 2005 - 12:04
#12
Udfra problem stillinge formoder jeg at vi snakker penge. Og penge er normalt kun 2 decimaler. Og man må aldrig aldrig aldrig bruge float og double til penge.
31. marts 2005 - 12:45
#13
Jeg har prøvet denne her: Label3.Text = ((decimal)((int)((antal + 0.249m) * 4))) / 4; Men får at vide, at en ikke kan konvertere int til string. Hvordan skriver jeg det om så ?
31. marts 2005 - 12:45
#14
Er det bare Convert.ToString ?
31. marts 2005 - 12:46
#15
Label3.Text = (((decimal)((int)((antal + 0.249m) * 4))) / 4).ToString();
31. marts 2005 - 12:47
#16
Hvis jeg bruger denne her: Label3.Text = Convert.ToString(((decimal)((int)((antal + 0.249m) * 4))) / 4) Så giver den det samme, som det tal, der bliver indtastet. Altså, man indtaster det antal print, man ønsker, og så udskriver den, hvor mange penge, der skal betales
31. marts 2005 - 12:53
#17
decimal pris = (((decimal)((int)((antal + 0.249m) * 4))) / 4); Label3.Text = pris.ToString("d");
31. marts 2005 - 12:53
#18
Hvad står det der m for ? Det er jeg ikke med på
31. marts 2005 - 12:56
#19
decimal type notation - havde det været typen double udelades m'et
31. marts 2005 - 12:56
#20
Hm...nu er jeg lidt med - har byttet rundt på det
31. marts 2005 - 12:57
#21
Men jeg kan ikke få den til at virke jo.
31. marts 2005 - 12:59
#22
Den giver det samme, som der bliver indtastet. Ikke nogen, der kan hjælpe ? :-)
31. marts 2005 - 13:00
#23
Lidt mystisk. using System; class MainClass { public static decimal SpecialRound(decimal x) { return ((decimal)((int)((x + 0.249m) * 4))) / 4; } public static void Main(string[] args) { Console.WriteLine(SpecialRound(0.90m)); Console.WriteLine(SpecialRound(1.01m)); Console.WriteLine(SpecialRound(1.12m)); Console.WriteLine(SpecialRound(1.30m)); Console.WriteLine(SpecialRound(1.55m)); Console.WriteLine(SpecialRound(1.76m)); } } udskriver: 1 1.25 1.25 1.5 1.75 2
31. marts 2005 - 13:00
#24
antal for dit vedkommende er jo et antal print, men funktionen du bruger vil have en pris. decimal pris = (((decimal)((int)((pris ikke antal + 0.249m) * 4))) / 4); dvs du skal gange antal print med en pris først, og den pris du får sætter du så ind i funktionen ovenover.
31. marts 2005 - 13:03
#25
Jeg er helt forvirret nu,
31. marts 2005 - 13:06
#26
må vi se din kode?
31. marts 2005 - 13:08
#27
Nu har jeg lavet den sådan her: private void btn_beregn_Click(object sender, System.EventArgs e) { int antal = Convert.ToInt32(txb_antal.Text); antal = Convert.ToInt32(antal*0.30); Label3.Text = (((decimal)((int)((antal + 0.249m) * 4))) / 4).ToString(); } Men hvad gør, at der ikke kommer decimaler med?
31. marts 2005 - 13:15
#28
antal = Convert.ToInt32(antal*0.30); her laver du det om til en int - fyfy, så ryger decimalerne jo
31. marts 2005 - 13:16
#29
decimal samletPris = Convert.ToDecimal(antal*30); Label3.Text = (((decimal)((int)((samletPris + 0.249m) * 4))) / 4).ToString();
31. marts 2005 - 13:16
#30
Hehe, men da jeg skrev double antal, gik der noget galt længere nede.
31. marts 2005 - 13:17
#31
ups - glemte komma decimal samletPris = Convert.ToDecimal(antal*0.30); Label3.Text = (((decimal)((int)((samletPris + 0.249m) * 4))) / 4).ToString();
31. marts 2005 - 13:19
#32
Så virker det - tak for det. Kan du ikke også smide et svar, Arne, så du og spif2001 deler ?
31. marts 2005 - 15:03
#33
lidt svært når der er accepeteret et svar .....
31. marts 2005 - 15:05
#34
Jep - kom til at trykke - så må du få nogle point fra ham :-)
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.