TDecimal fix

This commit is contained in:
Michael Schimmel
2025-09-12 15:42:02 +02:00
parent 3c8be92b4a
commit 17c5b90ecf
+5 -13
View File
@@ -166,22 +166,18 @@ class operator TDecimal.Multiply(const A, B: TDecimal): TDecimal;
begin begin
var scaleA := A.GetScale; var scaleA := A.GetScale;
var scaleB := B.GetScale; var scaleB := B.GetScale;
var valA := A.GetValue;
var valB := B.GetValue;
if scaleA = scaleB then if scaleA = scaleB then
begin begin
// Fast path for performance when scales are identical // Fast path for performance when scales are identical
var resultValue := MulDivInt64(valA, valB, PowersOf10[scaleA]); var resultValue := MulDivInt64(A.GetValue, B.GetValue, PowersOf10[scaleA]);
Result := TDecimal.Create(resultValue, scaleA); Result := TDecimal.Create(resultValue, scaleA);
end end
else else
begin begin
// Slower path for different scales // Slower path for different scales
var targetScale := Max(scaleA, scaleB); var targetScale := Max(scaleA, scaleB);
// Effective power of 10 to divide by is Min(scaleA, scaleB) var resultValue := MulDivInt64(A.GetValue, B.GetValue, PowersOf10[Min(scaleA, scaleB)]);
var scaleIndex := Min(scaleA, scaleB);
var resultValue := MulDivInt64(valA, valB, PowersOf10[scaleIndex]);
Result := TDecimal.Create(resultValue, targetScale); Result := TDecimal.Create(resultValue, targetScale);
end; end;
end; end;
@@ -192,15 +188,13 @@ begin
if bVal = 0 then if bVal = 0 then
raise EDivByZero.Create('Division by zero'); raise EDivByZero.Create('Division by zero');
var aVal := A.GetValue;
var aScale := A.GetScale; var aScale := A.GetScale;
var bScale := B.GetScale; var bScale := B.GetScale;
// Fast path for performance when scales are identical // Fast path for performance when scales are identical
if aScale = bScale then if aScale = bScale then
begin begin
var multiplier := PowersOf10[aScale]; var resultValue := MulDivInt64(A.GetValue, PowersOf10[aScale], bVal);
var resultValue := MulDivInt64(aVal, multiplier, bVal);
Result := TDecimal.Create(resultValue, aScale); Result := TDecimal.Create(resultValue, aScale);
exit; exit;
end; end;
@@ -210,16 +204,14 @@ begin
begin begin
var targetScale := aScale; var targetScale := aScale;
var tempB := TDecimal.Create(B, targetScale); var tempB := TDecimal.Create(B, targetScale);
var multiplier := PowersOf10[targetScale]; var resultValue := MulDivInt64(A.GetValue, PowersOf10[targetScale], tempB.GetValue);
var resultValue := MulDivInt64(aVal, multiplier, tempB.GetValue);
Result := TDecimal.Create(resultValue, targetScale); Result := TDecimal.Create(resultValue, targetScale);
end end
else // bScale > aScale else // bScale > aScale
begin begin
var targetScale := bScale; var targetScale := bScale;
var tempA := TDecimal.Create(A, targetScale); var tempA := TDecimal.Create(A, targetScale);
var multiplier := PowersOf10[targetScale]; var resultValue := MulDivInt64(tempA.GetValue, PowersOf10[targetScale], bVal);
var resultValue := MulDivInt64(tempA.GetValue, multiplier, bVal);
Result := TDecimal.Create(resultValue, targetScale); Result := TDecimal.Create(resultValue, targetScale);
end; end;
end; end;