From 3e12ee3220ef88f9a2a92d8be64553c10948d5aa Mon Sep 17 00:00:00 2001 From: KenTandrian Date: Thu, 18 Sep 2025 22:46:15 +0700 Subject: [PATCH] feat(api): update rounding logic --- .../portfolio/calculator/portfolio-calculator.ts | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index d3984ad0a..807566217 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -937,25 +937,22 @@ export abstract class PortfolioCalculator { ); } } else if (type === 'SELL') { - if ( - oldAccumulatedSymbol.quantity.gt(0) && - oldAccumulatedSymbol.quantity.eq(quantity) - ) { - // Selling all units, so investment should be 0 - investment = new Big(0); - } else if (oldAccumulatedSymbol.investment.gt(0)) { - // Selling part of a positive investment + if (oldAccumulatedSymbol.investment.gt(0)) { investment = oldAccumulatedSymbol.investment.minus( quantity.mul(oldAccumulatedSymbol.averagePrice) ); } else { - // Selling part of a negative investment (short sell) investment = oldAccumulatedSymbol.investment.minus( quantity.mul(unitPrice) ); } } + // Reset to zero if quantity is (almost) zero to avoid rounding issues + if (newQuantity.abs().lt(Number.EPSILON)) { + investment = new Big(0); + } + currentTransactionPointItem = { currency, dataSource,