FwBigDecimal
Aritmetica decimal de precisao arbitraria. Indispensavel pra calculos monetarios — float comum perde centavo.
Assinatura: oNum := FwBigDecimal():New(cValor) // :Add(o), :Sub(o), :Mul(o), :Div(o), :ToString()
Retorna: FwBigDecimal object
FwBigDecimal e a classe TLPP para aritmetica monetaria com precisao garantida. Resolve o problema classico de float (0.1 + 0.2 != 0.3) ao usar representacao decimal exata.
#include "tlpp-core.th"
User Function CalcImpostos()
Local oValor := FwBigDecimal():New("1000.00")
Local oAliq := FwBigDecimal():New("0.18")
Local oIcms := oValor:Mul(oAliq)
ConOut(oIcms:ToString()) // "180.00" exato
Return
Por que nao float
// ERRADO (float comum)
n := 0.1 + 0.2 // 0.30000000000000004
n := 0.1 * 0.1 // 0.010000000000000002
// CERTO
oA := FwBigDecimal():New("0.1")
oB := FwBigDecimal():New("0.2")
ConOut(oA:Add(oB):ToString()) // "0.3" exato
Pegadinhas
- Sempre construir com string — passar float ja perde precisao.
- Operacoes retornam novo objeto — nao mutam o original.
- Performance — bigdecimal e mais lento que float; usar em loops apertados pode degradar.
- Imposto/financeiro — use sempre BigDecimal. Nunca
nValor * nAliqdireto.