@Blup: ist mir dafür zu aufwändig.
Hier nochmal der Code falls jemand bisl testen will:
Delphi-Quellcode:
program RoundTest;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
db,
dbtables;
var
Table: TTable;
DbaseFile:
string;
Temp:
array[0..255]
of char;
Def: TFieldDef;
Values:
array[0..7]
of Double = (2.5, 3.5, 2.2, 2.8, 2.25, 2.35, 2.22, 2.28);
ValuesWanted:
array[0..7]
of Double = (3, 4, 2, 3, 2.3, 2.4, 2.2, 2.3);
i: Integer;
begin
if GetTempPathA(SizeOf(Temp), Temp) > 0
then begin
DbaseFile := IncludeTrailingPathDelimiter(Temp) + '
test1234.dbf';
Table := TTable.Create(
nil);
Table.TableType := ttDBase;
Table.TableLevel := 4;
Table.TableName := ExtractFileName(dBaseFile);
Table.DatabaseName := ExtractFilePath(DbaseFile);
Def := Table.FieldDefs.AddFieldDef;
Def.
Name := '
Feld';
Def.DataType := ftBCD;
Def.Precision := 5;
// Delphi vertauscht Precision und Size
Def.Size := 1;
Table.CreateTable;
Table.Open;
for i := Low(Values)
to High(Values)
do begin
Table.Append;
if i < 4
then
Table['
Feld'] := Round(Values[i])
else
Table['
Feld'] := Values[i];
Table.Post;
end;
Table.First;
for i := Low(Values)
to High(Values)
do begin
if i < 4
then
Writeln(Format('
Format: %0.0f', [Values[i]]), '
Round: ', Table['
Feld'], '
wanted: ', FloatToStr(ValuesWanted[i]))
else
Writeln(Format('
Format: %0.1f', [Values[i]]), '
Table: ', Table['
Feld'], '
wanted: ', FloatToStr(ValuesWanted[i]));
Table.Next;
end;
Table.Close;
Table.Free;
ReadLn;
end;
end.
Schade, dass intern bei Variant konvertierung nicht Format verwendet wird, das liefert immer das "richtige" Ergebnis.
Toll ist übrigens auch, dass bei der Verwendung von z.B. rmUpals RoundMode in Delphi bei der Optimierung nicht verwendet wird.
Delphi-Quellcode:
SetRoundMode(rmUp)
Caption := IntToStr(Round(2.5));
liefert eine 2, da durch die Optimierung die Konstante schin intern auf 2, mit dem rmNearest Verfarhen gerundet wird...