Subject RE: [firebird-support] Udf and Double Field
Author Alan McDonald
> Hi,
> I am using firebird 1.5.1
> I have written an udf funtion with delphi 7.
> This function is called RoundDouble
> Here is the function code.
>
> Type
> DD = ^Double;
>
> Function RoundDouble (X : DD; NDigit : PSmallInt) : Extended; Stdcall;
> Var A,Sayi,Tamsayi,Kusurat : Extended;
> Begin
> Sayi:=X^;
> Tamsayi:=Int(Sayi);
> Kusurat:=Sayi - Tamsayi;
>
> if (Kusurat <> 0) Then
> Begin
> A:=Exp(NDigit^ * Ln(10));
> Kusurat:=Round(Kusurat * A) / A;
> End;
>
> Result:=Tamsayi + Kusurat;
> End;
>
> But this function is returns very sensitive numbers
>
> Example
> =======
> SELECT RoundDouble(1255521000.321313213,2),
> RoundDouble(1199392449.91999984,2) FROM RDB$DATABASE
> The result is that:
> 1255521000.31999993
> 1199392449.92000008
>
> but the result numbers are very sensitive
> the result must be
> 1255521000.32
> 1199392449.92
>
> what is the problem
> is this problem about firebird server
> i have tried another alternative but i can't find the solutions.
>

two things you can try.
1. use the standard udf libary which will do the right thing - no need to do
it yourself, someone else has already invented this wheel.
OR
2. return your result as a varchar (2 places) and then cast the result as a
double on the client.
Alan