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
var scaleA := A.GetScale;
var scaleB := B.GetScale;
var valA := A.GetValue;
var valB := B.GetValue;
if scaleA = scaleB then
begin
// 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);
end
else
begin
// Slower path for different scales
var targetScale := Max(scaleA, scaleB);
// Effective power of 10 to divide by is Min(scaleA, scaleB)
var scaleIndex := Min(scaleA, scaleB);
var resultValue := MulDivInt64(valA, valB, PowersOf10[scaleIndex]);
var resultValue := MulDivInt64(A.GetValue, B.GetValue, PowersOf10[Min(scaleA, scaleB)]);
Result := TDecimal.Create(resultValue, targetScale);
end;
end;
@@ -192,15 +188,13 @@ begin
if bVal = 0 then
raise EDivByZero.Create('Division by zero');
var aVal := A.GetValue;
var aScale := A.GetScale;
var bScale := B.GetScale;
// Fast path for performance when scales are identical
if aScale = bScale then
begin
var multiplier := PowersOf10[aScale];
var resultValue := MulDivInt64(aVal, multiplier, bVal);
var resultValue := MulDivInt64(A.GetValue, PowersOf10[aScale], bVal);
Result := TDecimal.Create(resultValue, aScale);
exit;
end;
@@ -210,16 +204,14 @@ begin
begin
var targetScale := aScale;
var tempB := TDecimal.Create(B, targetScale);
var multiplier := PowersOf10[targetScale];
var resultValue := MulDivInt64(aVal, multiplier, tempB.GetValue);
var resultValue := MulDivInt64(A.GetValue, PowersOf10[targetScale], tempB.GetValue);
Result := TDecimal.Create(resultValue, targetScale);
end
else // bScale > aScale
begin
var targetScale := bScale;
var tempA := TDecimal.Create(A, targetScale);
var multiplier := PowersOf10[targetScale];
var resultValue := MulDivInt64(tempA.GetValue, multiplier, bVal);
var resultValue := MulDivInt64(tempA.GetValue, PowersOf10[targetScale], bVal);
Result := TDecimal.Create(resultValue, targetScale);
end;
end;