Einzelnen Beitrag anzeigen

norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
514 Beiträge
 
Delphi 12 Athens
 
#5

AW: Rundungsproblem in Delphi

  Alt 28. Jan 2025, 16:44
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

Geändert von norwegen60 (28. Jan 2025 um 16:46 Uhr)
  Mit Zitat antworten Zitat