/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
[spørgsmål] Afrunding
Fra : Niels


Dato : 14-03-02 14:25

Hejsa

Jeg har forsøgt at finde en afrundings-funktion, der runder
en værdi på fx 10.5 op til 11 og ikke ned til 10. De
afrundings-funktioner jeg har fundet anvender "Banker's
rounding" som runder ned til det "lige tal" hvis den angivne
værdi befinder sig midt mellem to værdier.

Findes der en funktion der gør dette eller skal jeg til at
finde på noget snavs?

pft.
Niels

 
 
Rasmus W (14-03-2002)
Kommentar
Fra : Rasmus W


Dato : 14-03-02 15:18

Niels wrote:

> Hejsa
>
> Jeg har forsøgt at finde en afrundings-funktion, der runder
> en værdi på fx 10.5 op til 11 og ikke ned til 10. De
> afrundings-funktioner jeg har fundet anvender "Banker's
> rounding" som runder ned til det "lige tal" hvis den angivne
> værdi befinder sig midt mellem to værdier.
>
> Findes der en funktion der gør dette eller skal jeg til at
> finde på noget snavs?
>
> pft.
> Niels
SetRoundMode virker oplagt.
SetRoundMode(rmNearest) får Round til at opføre sig på den måde du vil have
det.

Mvh Rasmus

Niels (14-03-2002)
Kommentar
Fra : Niels


Dato : 14-03-02 15:35

In article <bl2k8.503$ZI6.73704@news000.worldonline.dk>, Rasmus W
<if.you.really.want.to.mail.me.then.remove."notadomain".from.the.followi
ng.address:"rwatjen@notadomain.hotmail.com"> says...

> SetRoundMode virker oplagt.
> SetRoundMode(rmNearest) får Round til at opføre sig på den måde du vil have

Det havde jeg forsøgt:

SetRoundMode(rmNearest);
Label.Caption := FloatToStr(Round(190.5));

Giver at der vil stå "190" i Label, hvor jeg gerne vil
have der til at stå "191".



Rasmus W (14-03-2002)
Kommentar
Fra : Rasmus W


Dato : 14-03-02 16:58

Niels wrote:
> SetRoundMode(rmNearest);
> Label.Caption := FloatToStr(Round(190.5));
>
> Giver at der vil stå "190" i Label, hvor jeg gerne vil
> have der til at stå "191".
Det har du for så vidt ret i. Nu har jeg også selv prøvet.
Så kan du lave noget i stil med:
function myRound(float val) : long;
begin
if frac(val)>=0.5 then val:=val+0.5;
result := round(val);
end;

Det ser ikke ud som om der er nogen vej udenom.

Mvh Rasmus

Ulrik Vadstrup (15-03-2002)
Kommentar
Fra : Ulrik Vadstrup


Dato : 15-03-02 09:20


"Niels" <spam@nejtak.dk> wrote in message
news:MPG.16fad387f7fb0c72989683@news.tiscali.dk...
> In article <bl2k8.503$ZI6.73704@news000.worldonline.dk>, Rasmus W
> <if.you.really.want.to.mail.me.then.remove."notadomain".from.the.followi
> ng.address:"rwatjen@notadomain.hotmail.com"> says...
>
> > SetRoundMode virker oplagt.
> > SetRoundMode(rmNearest) får Round til at opføre sig på den måde du vil
have
>
> Det havde jeg forsøgt:
>
> SetRoundMode(rmNearest);
> Label.Caption := FloatToStr(Round(190.5));
>
> Giver at der vil stå "190" i Label, hvor jeg gerne vil
> have der til at stå "191".
>

Kunne du ikke bare ligge 0.5 til dit tal før du afrunder ?

Ulrik




R. A. Larsen (15-03-2002)
Kommentar
Fra : R. A. Larsen


Dato : 15-03-02 01:14

Rasmus W
<if.you.really.want.to.mail.me.then.remove."notadomain".from.the.following.
address:"rwatjen@notadomain.hotmail.com"> wrote:
>
> Niels wrote:
> > SetRoundMode(rmNearest);
> > Label.Caption := FloatToStr(Round(190.5));
> >
> > Giver at der vil stå "190" i Label, hvor jeg gerne vil
> > have der til at stå "191".

Du kunne jo bruge:

Label.Caption := Format('%.0f', [190.5]);

> Så kan du lave noget i stil med:
> function myRound(float val) : long;
> begin
> if frac(val)>=0.5 then val:=val+0.5;
> result := round(val);
> end;

Eller måske nærmere noget i stil med:

function myRound(float val) : long;
begin
result := trunc(val+0.5);
end;

MVH, René
--
Using Virtual Access
http://www.vamail.com


Thomas Due (15-03-2002)
Kommentar
Fra : Thomas Due


Dato : 15-03-02 09:30

> Eller måske nærmere noget i stil med:
>
> function myRound(float val) : long;
> begin
> result := trunc(val+0.5);
> end;
>
> MVH, René


Mjah,

Det er nu ikke helt rigtigt. Du skal nemlig lige tage højde for at
fraktion er præcis 0.5.

Function RealRound(no : Extended) : Int64;
begin
if Frac(no) = 0.5 then
Result := Trunc(no) + 1
else
Result := Round(no);
end;

Denne virker garanteret, jeg bruger den selv i et faktureringsmodul
jeg har skrevet.

Mvh
Thomas Due

Niels (15-03-2002)
Kommentar
Fra : Niels


Dato : 15-03-02 20:04

In article <VA.00000167.007a1e12@r_larsen>, r_larsen@image.dk says...
> Rasmus W
> <if.you.really.want.to.mail.me.then.remove."notadomain".from.the.following.
> address:"rwatjen@notadomain.hotmail.com"> wrote:
> >
> > Niels wrote:
> > > SetRoundMode(rmNearest);
> > > Label.Caption := FloatToStr(Round(190.5));
> > >
> > > Giver at der vil stå "190" i Label, hvor jeg gerne vil
> > > have der til at stå "191".
>
> Du kunne jo bruge:
>
> Label.Caption := Format('%.0f', [190.5]);

Jeps. Den tror jeg at vi nupper. Er stadig forbløffet over at der
ikke lige umiddelbart findes en funktion der gør det ønskede og så
virker ovenstående løsning som den mest elegante. Takker!

Jørn Rasmussen (16-03-2002)
Kommentar
Fra : Jørn Rasmussen


Dato : 16-03-02 08:41


Niels skrev i meddelelsen ...
>
>Jeps. Den tror jeg at vi nupper. Er stadig forbløffet over at der
>ikke lige umiddelbart findes en funktion der gør det ønskede og så

>virker ovenstående løsning som den mest elegante. Takker!


Prøv nedenstående som jeg har fundet på nettet, men har ikke fået
noteret hvor.
Lad mig vide om den løser dit problem.

Med venlig hilsen
Jørn Rasmussen


function RoundN(x: Extended; d: Integer): Extended;
// RoundN(123.456, 0) = 123
// RoundN(123.456, 2) = 123.46
// RoundN(123456, -3) = 123000
const
t: array [0..12] of int64 = (1, 10, 100, 1000, 10000, 100000,
1000000, 10000000, 100000000, 1000000000, 10000000000,
100000000000, 1000000000000);
begin
if Abs(d) > 12 then
raise ERangeError.Create('RoundN: Value must be in -12..12');
if d = 0 then
Result := Int(x) + Int(Frac(x) * 2)
else if d > 0 then begin
x := x * t[d];
Result := (Int(x) + Int(Frac(x) * 2)) / t[d];
end else begin // d < 0
x := x / t[-d];
Result := (Int(x) + Int(Frac(x) * 2)) * t[-d];
end;
end;






Uffe Kousgaard (15-03-2002)
Kommentar
Fra : Uffe Kousgaard


Dato : 15-03-02 11:08

simpleroundto(x,0) giver vidst det ønskede.

"Niels" <spam@nejtak.dk> wrote in message
news:MPG.16fac321d3e5d3ad989682@news.tiscali.dk...
> Hejsa
>
> Jeg har forsøgt at finde en afrundings-funktion, der runder
> en værdi på fx 10.5 op til 11 og ikke ned til 10. De
> afrundings-funktioner jeg har fundet anvender "Banker's
> rounding" som runder ned til det "lige tal" hvis den angivne
> værdi befinder sig midt mellem to værdier.
>
> Findes der en funktion der gør dette eller skal jeg til at
> finde på noget snavs?
>
> pft.
> Niels


Claus Nielsen (15-03-2002)
Kommentar
Fra : Claus Nielsen


Dato : 15-03-02 16:55

>Findes der en funktion der gør dette eller skal jeg til at
>finde på noget snavs?

Kig en gang på funktionerne Floor og Ceil

Mvh, Claus
---
I never apologize! I'm sorry, but that's the way I am.
- Homer Simpson

R. A. Larsen (15-03-2002)
Kommentar
Fra : R. A. Larsen


Dato : 15-03-02 19:52

tdue@mail.dk (Thomas Due) wrote:
>
> > Eller måske nærmere noget i stil med:
> >
> > function myRound(float val) : long;
> > begin
> > result := trunc(val+0.5);
> > end;
> >
> > MVH, René
>
> Det er nu ikke helt rigtigt. Du skal nemlig lige tage højde for at
> fraktion er præcis 0.5.

Hvis 'val' er 0.5, bliver 'val+0.5' lig med 1.0. 'Trunc(1.0)' giver 1.
Hvad er problemet så?

MVH, René
--
Using Virtual Access
http://www.vamail.com


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste