|
| [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
| |
|
|