In Delphi I have 2 functions that works (I override default sqlite round):
const
ExtEps = 1.0842021725E-19;
DblEps = 2.2204460493E-16;
KnownErrorLimit = 1.234375;
SafetyFactor = 2;
MaxRelErrDbl = DblEps * KnownErrorLimit * SafetyFactor;
MaxRelErrExt = ExtEps * KnownErrorLimit * SafetyFactor;
function RoundExt(const AValue: Extended; const ADigit: Integer = -2):
Extended;
var
E: Extended;
begin
E := IntPower(10, -ADigit);
Result := Round(AValue * (1 + MaxRelErrExt) * E) / E;
end;
function RoundDbl(const AValue: Double; const ADigit: Integer = -2):
Double;
var
E: Double;
begin
E := IntPower(10, -ADigit);
Result := Round(AValue * (1 + MaxRelErrDbl) * E) / E;
end;
You could implement it in sqlite.
Regards Radovan
On 24.05.2019 13:13, Richard Hipp wrote:
On 5/24/19, Hajo Bruns <hbr...@plansoft.de> wrote:
Hi,
the round function seems to round inconsistently:
ivesselect round(5.485,2), round (3.555,2),round (3.255,2)
gives
5,49 3,56 3,25
Last result should be 3.26
3.255 cannot be exactly represented as an IEEE754 double-precision
binary floating point number. So the system has to use an
approximation. The closest approximation is
3.25499999999999989341858963598497211933135986328125 and that value
rounds to 3.25.
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users