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

Veja também