Tut mit leid das ich mich erst jetzt wieder einschalte war total im Stress.
Dir Rechnung sollte lauten 3,45*3*0,9=9,315 anstatt 3,45*3/0,9=9,315. Sorry.
Ich konnte mittlerweile die Sache aufklären:
Ich rufe an bestimmten Programmpunkten eine externe
DLL auf die in CaVo (Visual Object)
geschrieben ist und ich rufe nicht FormatFloat direkt auf sondern eine Funktion:
Delphi-Quellcode:
function FormStr(const v: Variant; nLen: integer; nDec: integer = 0): string;
var
cFormat : string;
procedure MakeFormat;
begin
if nLen > 3 then
cFormat := '#,'+cFormat;
end;
begin
if nDec = 0 then
begin
cFormat := '##0';
MakeFormat;
end
else
begin
cFormat := '##0.'+Replicate('0',nDec);
nLen := nLen-nDec-1;
MakeFormat;
end;
Result := FormatFloat(cFormat,v);
end;
Diese Funktion bekommt den Zahlenwert als Variant übertragen und funktioniert solange ich nicht
die besagte
DLL aufgerufen habe. Ich habe noch eine weitere ähnliche Funktion die mit Str arbeitet
wo es zum gleichen Problem kommt.
Die Lösung liegt zum einen in der Verwendung von Currency-Variablen (wo es möglich ist) zum anderen auf die angesprochenen Funktionen bezogen auf zusätzliche Rundungsfunktionen.
Delphi-Quellcode:
function FormStr(v: Variant; nLen: integer; nDec: integer = 0): string;
var
cFormat : string;
procedure MakeFormat;
begin
if nLen > 3 then
cFormat := '#,'+cFormat;
end;
begin
if nDec = 0 then
begin
cFormat := '##0';
MakeFormat;
end
else
begin
cFormat := '##0.'+Replicate('0',nDec);
nLen := nLen-nDec-1;
MakeFormat;
end;
case VarType(v) of
varCurrency : v := MyRoundC(v,nDec);
varInteger : ;
else v := MyRound(v,nDec);
end;
Result := FormatFloat(cFormat,v);
end;
function MyRoundC(nZahl:Currency;nDec:integer):Currency;
var
i: integer;
begin
for i := 1 to nDec do nZahl := nZahl * 10;
nZahl := Int(nZahl + iif(nZahl > 0, 0.5, -0.5));
for i := 1 to nDec do nZahl := nZahl / 10;
Result := nZahl;
end;
Wie gesagt damit löse ich die Probleme aber interessieren würde es mich doch was die ext.
DLL
mit den Variants anstellt. Falls also jemand eine Idee hat ...
Ist die Round-Funktion Ok oder gibt es bessere Lösungen ?
Grüße
Frank