TDecimal fix
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user