IEEE 754 não serve pra dinheiro. A SEFAZ não perdoa.
JavaScript usa ponto flutuante (IEEE 754).
0.1 + 0.2
não dá
0.3.
Quando a NF-e diverge 1 centavo, a SEFAZ rejeita com erro 629/630.
.toFixed(2)
mascara, não resolve: o erro já acumulou nas operações intermediárias.
Nota rejeitada = venda parada.
// JavaScript nativo (IEEE 754) 1.064 * 39680 // = 42219.520000000004 // .toFixed(2) mascara, mas o erro já propagou // → SEFAZ: REJEITADO (erro 629). vProd ≠ vUnCom × qCom // tributos-br (aritmética decimal sobre strings) Decimal.from("1.064").mul("39680").toFixed(2) // = "42219.52" (exato, sempre) // → SEFAZ: AUTORIZADO ✓
Cálculo fiscal completo com a precisão que a SEFAZ exige
Funções puras. Recebe parâmetros, retorna resultado com audit trail de cada etapa. Stateless e auditável.
calcSt() quando IPI
compõe a base ST.
calcSt() cobre 5
cenários via parâmetros: MVA, pauta fiscal, redução de base, FECOP.
Exemplos que copiam e colam
Cada calculador recebe parâmetros, retorna resultado tipado com Decimal + audit trail. Sem hardcode de alíquotas.
Cada centavo rastreável
A SEFAZ rejeitou. E agora?
Com
.toFixed(2), você sabe que deu errado. Com tributos-br, você sabe onde deu
errado.
Todo calculador retorna um array
audit: AuditStep[]
com cada operação intermediária. Nome do passo, fórmula aplicada, valor resultante.
A maioria dos ERPs menores não expõe isso. Quando o fiscal liga perguntando "de onde veio esse número", você tem a resposta.
Centavos por operação. Milhares por mês.
O erro não parece grande em uma nota. Mas se repete em todas.
Valores calculados com operação interestadual de R$ 1.000, alíquota inter 12%, interna 18%, MVA 40%.
Por que tributos-br?
O que faz alguém instalar em vez de implementar na mão.
-
1Audit trail em cada cálculoQuando a SEFAZ rejeita, você sabe exatamente onde o arredondamento ou a precisão causou a divergência. Cada função retorna um array de steps com fórmula e valor de cada etapa. A maioria das libs e ERPs menores não oferece isso.
-
2DIFAL base dupla (LC 190/2022)A maioria dos ERPs menores calcula DIFAL apenas com base única. tributos-br implementa ambos os métodos: base única para não-contribuinte (B2C) e base dupla para contribuinte (B2B), selecionando automaticamente via parâmetro.
-
3FECOP na MVA AjustadaALQ Intra Efetiva = ALQ Interna + FECOP. Ignorar FECOP gera diferença de ~4 pontos percentuais na MVA. Estados com FECOP: RJ, MG, CE, PE, BA, GO, MT, PI.
-
4Função ST unificadaUma única
calcSt()cobre todos os 5 cenários de Substituição Tributária via parâmetros opcionais: MVA original, MVA ajustada com FECOP, pauta fiscal, redução de base. Sem nomenclatura ST-01 a ST-05. -
5Não é "só mais uma lib de decimal"decimal.js e big.js resolvem precisão, mas você ainda precisa implementar cada fórmula fiscal, cada modo de arredondamento SEFAZ, cada cenário de ST/DIFAL/MVA. tributos-br entrega as calculadoras prontas, tipadas, com audit trail. Zero dependências, incluindo as de decimal.
O que tem dentro
calcCbs() e calcIbs() com
alíquotas parametrizáveis para acompanhar cada fase.
Comece em 30 segundos
Funciona com npm, yarn e pnpm. ESM e CommonJS. TypeScript strict.
| Import | Conteúdo |
|---|---|
| tributos-br | Calculadoras (ICMS, IPI, DIFAL, ST, CBS/IBS) + Decimal |
| tributos-br/precision | Apenas Decimal + RoundingMode |