From 17c5b90ecf4bab91f326eb78a7f708dbcca2bc69 Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Fri, 12 Sep 2025 15:42:02 +0200 Subject: [PATCH] TDecimal fix --- Src/Data/Myc.Data.Decimal.pas | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/Src/Data/Myc.Data.Decimal.pas b/Src/Data/Myc.Data.Decimal.pas index 0b772d9..9faa884 100644 --- a/Src/Data/Myc.Data.Decimal.pas +++ b/Src/Data/Myc.Data.Decimal.pas @@ -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;