Delphi-Quellcode:
function SimpleRoundTo(const AValue: Extended; const ADigit: TRoundToRange = -2): Extended;
var
LFactor: Extended;
begin
LFactor := IntPower(10.0, ADigit);
if AValue < 0 then
Result := Int((AValue / LFactor) - 0.5) * LFactor
else
Result := Int((AValue / LFactor) + 0.5) * LFactor;
end;
Das war, was ich ursprünglich verwendet habe, was aber beim Aufruf die 182.1325 in 182.132 gerundet hat.
Ich hatte die Funktion als Overload mit Extended und Double. Habe mittlerweile raus gefunden, dass Aufruf mit Extended korrekt auf 182.133 rundet, Aufruf mit Double aber auf 182.132. Das Programm in dem ich arbeite, arbeitet aber nahezu durchgängig mit Double und das umzustellen wäre ein ziemlicher Akt. Und wer weiß was da dann dafür passiert.
Und natürlich ist die Umstellung von TRUNC auf ROUND auch nicht zielführend. Kann ja nicht zuerst 0.5 dazuaddieren und dann noch runden.
Ich lasse es bei meinem "Bastelansatz" und der sieht bei Double jetzt so aus
Delphi-Quellcode:
function RoundToDecimals(rValue: Double; iDecimals: Integer): Double;
var
rFactor: Double;
begin
rValue := rValue + 0.0000000000001;
rFactor := IntPower(10.0, -iDecimals);
if rValue < 0 then
Result := Int((rValue / rFactor) - 0.5) * rFactor
else
Result := Int((rValue / rFactor) + 0.5) * rFactor;
exit;
end;
Verwende das Ganze nur zum Runden von Dezimalen, und iDecimals wird immer nur positiv übergeben
Die 0.0000000000001 war der unterste Wert, der meine Wert so korrigiert hat, dass danach 184.133 raus kam. Egal wo ich die Funktion verwende, mehr als 10 Dezimalen werden nie angezeigt (Normal sind max 6). Die Erhöhung ist also nicht relevant
Ach ja: Die D7 Formel kommt auch auf 184.132