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