Avatar billede hugopedersen Nybegynder
28. december 2009 - 11:31 Der er 11 kommentarer og
1 løsning

Afrunding af kroner/øre

Nogen der ligger inde med noget smart kode til afrunding af krone/øre?
Det skulle gerne kunne runde både op og ned til en given mønt
F.eks
Afrund(123.44, Up, 25)  = 123.50
Afrund(123.44, Down, 25)  = 123.25
Avatar billede Slettet bruger
28. december 2009 - 15:20 #1
Jeg kan ikke Delphi, så du får noget pseudokode:

double Afrund(double value,int roundUp,double fraction){
  double remainder = value % fraction;
  if(remainder != 0){
    value = value - remainder + roundUp * fraction;
  }
  return value;
}

F.eks:
Afrund(123.44, 1, 0.25); //1 for at runde op
Afrund(123.44, 0, 0.25); //0 for at runde ned

/1
Avatar billede arne_v Ekspert
28. december 2009 - 15:32 #2
Mit forslag:

type
  UpOrDown = (Up, Down);

function MRound(amt : extended; mode : UpOrDown; scale : integer): extended;

var
  tmp : extended;

begin
  tmp := amt * (100 div scale);
  if mode = Up then
    MRound := ceil(tmp) / (100 div scale)
  else
    MRound := floor(tmp) / (100 div scale);
end;
Avatar billede arne_v Ekspert
28. december 2009 - 15:32 #3
Men men men.

Genrelt bør du aldrig gemme beløb i floating point typer !!
Avatar billede hugopedersen Nybegynder
28. december 2009 - 17:28 #4
Hvad mener du med 'Genrelt bør du aldrig gemme beløb i floating point typer' ?
(jeg bruger Currency type når jeg henter og gemmer i databasen)

Jeg faldt senere over http://www.eksperten.dk/spm/825395

Men jeg har en mistanke om at der er et eller andet når man runder op til de helt store værdier - jeg tror der er sneget et 0 for meget på.
Avatar billede arne_v Ekspert
28. december 2009 - 18:04 #5
Currency er fixed point ikke floating point, så den bør være OK.
Avatar billede arne_v Ekspert
28. december 2009 - 18:06 #6
Så bare ret min extended til currency.
Avatar billede arne_v Ekspert
28. december 2009 - 18:10 #7
Grunden til at jeg bragte det på banen er at 123.44 er en floating point konstant ikke en currency konstant.
Avatar billede hrc Mester
29. december 2009 - 03:34 #8
Jeg gemmer beløb i heltalsfelter ved at gemme værdien i ører. Når jeg gemmer, multipliceres der med 100 (12344) og når jeg skal læse divideres med 100 (-> 123.44). Der er selvfølgelig noget arbejde frem og tilbage og hvis Arne eller andre har kritik vil jeg gerne snylte lidt på Hugos spørgsmål og høre hvad det er.

Tilsvarende gemmer jeg tidsintervaller omregnet til minutter.
Avatar billede arne_v Ekspert
29. december 2009 - 03:55 #9
Det er helt fint. Det svarer stort set til hvad currency gør. currency er en 64 bit integer med implicit 4 decimaler. Om du bruger 32 bit integer og 2 decimaler eller 64 bit integer og 4 decimaler gør ikke nogen principiel forskel. 32 bit integer med 2 decimaler kan dog kun klare op til ca. 21 millioner kroner (og kan kun klare hele ører ikke 1/10 ører, men det er ikke noget problem i Danmark).

Men floating point duer ikke til beløb.

Floating point er fremragende til mål som har usikkerhed.

Din bogholder ser helt forkert ud i hovedet, hvis du siger at der er 1132.15 kroner +/- 0.001 krone i kassen.

Det er ligegyldigt om du har 49.5 km eller 49.5 km +/- 10 centimeter til og fra arbejde (det giver faktisk ingen mening, fordi usikkerheden på hvor du holder i indkørslen er større).
Avatar billede hugopedersen Nybegynder
30. december 2009 - 09:17 #10
arne_V> jeg tror jeg vil prøve at anvende den med de +/- kroner når jeg snakker med min chef første gang her efter jul - han er revisor :-)  jeg tror også han kan præstere en spændende ansigtskulør hvis man siger sådan.
Avatar billede hrc Mester
30. december 2009 - 22:52 #11
Arne. Tak for tippet om Currency - noget jeg ikke havde sat mit ordentlig ind i.

I øvrigt. Ser revisorer ikke altid forkerte ud i ansigtet?
Avatar billede arne_v Ekspert
10. januar 2010 - 04:20 #12
og et svar fra mig
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