Avatar billede linemus83 Nybegynder
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
Avatar billede bennytordrup Nybegynder
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.
Avatar billede bennytordrup Nybegynder
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);
        }

    }
Avatar billede spif2001 Nybegynder
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;
}
Avatar billede arne_v Ekspert
31. marts 2005 - 11:16 #4
Mit forslag:

    public static decimal SpecialRound(decimal x)
    {
        return ((decimal)((int)((x + 0.249m) * 4))) / 4;
    }
Avatar billede spif2001 Nybegynder
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
Avatar billede bennytordrup Nybegynder
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.
Avatar billede spif2001 Nybegynder
31. marts 2005 - 11:25 #7
øhmm.. Arne?

1.51 giver 1.75 med den metode...
Avatar billede spif2001 Nybegynder
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... :)
Avatar billede burningice Nybegynder
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.
Avatar billede burningice Nybegynder
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 ;)
Avatar billede spif2001 Nybegynder
31. marts 2005 - 12:01 #11
ah - sorry - fik læst lidt for hurtigt ;)
Avatar billede arne_v Ekspert
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.
Avatar billede linemus83 Nybegynder
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å ?
Avatar billede linemus83 Nybegynder
31. marts 2005 - 12:45 #14
Er det bare Convert.ToString ?
Avatar billede spif2001 Nybegynder
31. marts 2005 - 12:46 #15
Label3.Text = (((decimal)((int)((antal + 0.249m) * 4))) / 4).ToString();
Avatar billede linemus83 Nybegynder
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
Avatar billede burningice Nybegynder
31. marts 2005 - 12:53 #17
decimal pris = (((decimal)((int)((antal + 0.249m) * 4))) / 4);

Label3.Text = pris.ToString("d");
Avatar billede linemus83 Nybegynder
31. marts 2005 - 12:53 #18
Hvad står det der m for ? Det er jeg ikke med på
Avatar billede spif2001 Nybegynder
31. marts 2005 - 12:56 #19
decimal type notation - havde det været typen double udelades m'et
Avatar billede linemus83 Nybegynder
31. marts 2005 - 12:56 #20
Hm...nu er jeg lidt med - har byttet rundt på det
Avatar billede linemus83 Nybegynder
31. marts 2005 - 12:57 #21
Men jeg kan ikke få den til at virke jo.
Avatar billede linemus83 Nybegynder
31. marts 2005 - 12:59 #22
Den giver det samme, som der bliver indtastet. Ikke nogen, der kan hjælpe ? :-)
Avatar billede arne_v Ekspert
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
Avatar billede spif2001 Nybegynder
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.
Avatar billede linemus83 Nybegynder
31. marts 2005 - 13:03 #25
Jeg er helt forvirret nu,
Avatar billede spif2001 Nybegynder
31. marts 2005 - 13:06 #26
må vi se din kode?
Avatar billede linemus83 Nybegynder
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?
Avatar billede spif2001 Nybegynder
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
Avatar billede spif2001 Nybegynder
31. marts 2005 - 13:16 #29
decimal samletPris = Convert.ToDecimal(antal*30);
Label3.Text = (((decimal)((int)((samletPris + 0.249m) * 4))) / 4).ToString();
Avatar billede linemus83 Nybegynder
31. marts 2005 - 13:16 #30
Hehe, men da jeg skrev double antal, gik der noget galt længere nede.
Avatar billede spif2001 Nybegynder
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();
Avatar billede linemus83 Nybegynder
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 ?
Avatar billede arne_v Ekspert
31. marts 2005 - 15:03 #33
lidt svært når der er accepeteret et svar .....
Avatar billede linemus83 Nybegynder
31. marts 2005 - 15:05 #34
Jep - kom til at trykke - så må du få nogle point fra ham :-)
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