Avatar billede torotune Nybegynder
06. marts 2013 - 15:59 Der er 8 kommentarer og
1 løsning

Hjælp til speciel afrunding

Hej,

Jeg har en problematik som jeg skal indføre i et program. Det består af en afrundingsfaktor som skal influere på et tal.


Eksempler:

- Hvis jeg har 112 og min afrundingsfaktor er 9
ender vi på 109

- Hvis jeg har 247 og min afrundingsfaktor er 0
ender vi på 250

- Hvis jeg har 146 og min afrundingsfaktor er 8
ender vi på 148

- Hvis jeg har 131 og min afrundingsfaktor er 7
ender vi på 127

Så det handler om, hvorledes afrundingsfaktoren
får grundtallet til at blive i egen 10'er-række eller hoppe ned i forrige/op i næste, alt efter hvad der ligger tættest. 

Man kan jo godt ved at kigge op tallet og afrundingsfaktoren se hvor vi ender, men
hvordan kan jeg stille dette op logisk, så jeg kan omsætte det til programmeringssprog.

Nogen der kan hjælpe lidt på vej? :-)
Avatar billede arne_v Ekspert
06. marts 2013 - 16:06 #1
Den meget primitive maade er:

tal1 = (tal / 10) * 10 + afrunding;
tal2 = tal1 - 10;
tal3 = tal1 + 10;

og saa finde dte mindste af tal1, tal2 og tal3.

Men der boer vaere en smartere maade at goere det paa.
Avatar billede alphabits Nybegynder
06. marts 2013 - 22:34 #2
Gætter på at du ikke skal håndtere negative tal. Hvis tallet der skal afrundes hedder x og afrundingsfaktoren hedder a:

public int afrund(int x, int a)
{
    if (x < a) { return a; }

    return ((x-a) / 10) * 10 + a
}
Avatar billede alphabits Nybegynder
07. marts 2013 - 07:23 #3
Ok, svar #2 er ikke rigtigt. Ved at heltalsdividere med 10 og gange med 10, runder man jo altid ned. Der skal bruges "almindelig afrunding" for at det virker

public int afrund(int x, int a)
{
    if (x < a) { return a; }

    return Math.Round((x-a) / 10) * 10 + a
}
Avatar billede torotune Nybegynder
07. marts 2013 - 09:42 #4
Hej - og tak for indlæggene.

@Arne, jeg har prøvet at køre din løsning gennem en funktion,
og hvis jeg kører dem gennem mine fire eksempler får jeg resultaterne af tal1, tal2, tal3:

- Hvis jeg har 112 og min afrundingsfaktor er 9:
121, 111, 131

- Hvis jeg har 247 og min afrundingsfaktor er 0:
247, 237, 257

- Hvis jeg har 146 og min afrundingsfaktor er 8:
154, 144, 164

- Hvis jeg har 131 og min afrundingsfaktor er 7:
138, 128, 148

Den er på vej, men jeg kan ikke helt se hvor den går galt.



@alphabits, jeg prøver at konvertere dit sidste forslag til noget VB'sk, men mit resultat bliver altid det samme som grundtallet hvis jeg bruger:

Public Function afrund(x As Integer, a As Integer) As Integer
        If (x < a) Then
            Return a
        Else
            Return Math.Round((x-a) / 10) * 10 + a
        End If
End Function

- Men jeg er ikke sikker på om den er korrekt oversat?? 

Mvh.
Avatar billede alphabits Nybegynder
07. marts 2013 - 10:12 #5
Jeg har aldrig programmeret i VB, men umiddelbart ser det ud til at du har oversat det korrekt. Men måske kalder du funktionen med forkerte parametrer. Prøv at give nogle eksempler på hvordan du kalder funktionen. Til gengæld har jeg fundet en lille fejl i min kode, så du får lige en opdateret version.

public int afrund(int x, int a)
{
    if (x < a) { return a; }
    double rounded = Math.Round((x-a) / 10.0) * 10;
    return (int)(rounded + a);
}

Hvis jeg f.eks. kalder afrund(120, 8) får jeg 118. Hvis jeg kalder afrund(120, 4) får jeg 124 osv.
Avatar billede MADOlsen Forsker
07. marts 2013 - 10:17 #6
#5 Den virker i hvert fald også ved mig :-)
Avatar billede arne_v Ekspert
07. marts 2013 - 14:18 #7
I VB proev med \ fremfor /
Avatar billede torotune Nybegynder
12. marts 2013 - 14:54 #8
Hej, efter jeg skiftede til forslaget i #5 virker det også helt som det skal her!

Takker for hjælpen, smider du et svar alphabits?
Avatar billede alphabits Nybegynder
12. marts 2013 - 15:50 #9
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