Parcelas no Power Automate sem perder centavos
R$ 100,00 em 3 vezes não é 33,33 + 33,33 + 33,33: falta 1 centavo. Veja como dividir em centavos, jogar o resto na última parcela e gerar os vencimentos, sem depender de uma função de arredondar que o Power Automate não tem.
O problema
Dividir 100,00 por 3 dá 33,333... Se você arredondar cada parcela para 33,33, a soma das três é 99,99: sumiu 1 centavo. Em financeiro, isso vira divergência de conciliação. A regra prática é: todas as parcelas recebem o valor-base, e a última recebe o valor-base mais o resto, de modo que a soma bata exatamente com o total.
Há um obstáculo no Power Automate: a lista de funções matemáticas (add, div, max, min, mod, mul, rand, range, sub) não tem função de arredondamento (e a pow, que aparece em algumas referências, também não existe: o fluxo responde "The template function 'pow' is not defined"). A saída é trabalhar com números inteiros em centavos, onde a divisão e o resto são exatos.
Por que trabalhar em centavos
- Com dois números inteiros,
divdevolve a parte inteira da divisão emoddevolve o resto. É exatamente o que precisamos. - Decimais em ponto flutuante trazem resíduos. Testado no Power Automate:
mul(19.99, 100)devolve1998.9999999999998(e não 1999) eadd(0.1, 0.2)devolve0.30000000000000004. Por isso o valor é convertido por texto, e não por multiplicação. - A documentação alerta que a divisão de inteiros trunca:
div(75, 200)retorna 0. Aqui isso é uma vantagem, desde que seja intencional.
Passo a passo
Suponha que o fluxo receba valor (por exemplo, 1000.00), parcelas (por exemplo, 3) e a data da primeira cobrança.
- Variável inteira
parcelas, com o valor:int(triggerBody()?['parcelas'])
- Variável inteira
totalCentavos. Formatamos o valor com duas casas e ponto decimal, tiramos o ponto e convertemos em inteiro:int(replace(formatNumber(float(triggerBody()?['valor']), '0.00', 'en-US'), '.', ''))
Para 1000.00, o texto formatado é1000.00, que vira100000. A culturaen-USgarante o ponto como separador, independentemente da configuração regional do fluxo. Se o valor vier com mais de duas casas, oformatNumberarredonda para duas, mas o arredondamento de metades não é uniforme (testado:formatNumber(0.125, '0.00')devolve0.13eformatNumber(2.675, 'F2')devolve2.67). Limite as casas decimais na origem. - Variável
base(valor de cada parcela, em centavos):div(variables('totalCentavos'), variables('parcelas')) - Variável
resto:mod(variables('totalCentavos'), variables('parcelas')) - Aplicar a cada sobre a sequência de 1 até o número de parcelas:
range(1, variables('parcelas'))Orange(1, 3)devolve[1, 2, 3](a partir do 1, na quantidade informada). - Dentro do loop, uma ação Compor chamada
Valor_parcela_centavos, com o valor desta parcela: a última recebe a base mais o resto.if(equals(items('Aplicar_a_cada'), variables('parcelas')), add(variables('base'), variables('resto')), variables('base')) - Outra ação Compor,
Valor_parcela_texto, para mostrar em reais no formato brasileiro:formatNumber(div(float(outputs('Valor_parcela_centavos')), 100), 'N2', 'pt-BR')Para 33333 centavos, o resultado é333,33. - E o vencimento. Para parcelas a cada 30 dias, a primeira em 30 dias:
addDays(utcNow(), mul(items('Aplicar_a_cada'), 30), 'yyyy-MM-dd')Para vencimento no mesmo dia de cada mês, prefiraaddToTime(data, número, 'Month'), que respeita o calendário.
range, Aplicar a cada, if, addDays) foi montado e executado em 02/11/2026, em um fluxo de teste sem conectores. Para R$ 1.000,00 em 3 vezes, a primeira parcela em 30 dias a partir de 02/11/2026, o resultado foi: 333,33 em 2026-12-02, 333,33 em 2027-01-01 e 333,34 em 2027-01-31. A calculadora de parcelas do Me Ajuda Flow produz exatamente os mesmos valores.Conferindo as contas (R$ 1.000,00 em 3 vezes)
| Item | Resultado |
|---|---|
| totalCentavos | 100000 |
| base = div(100000, 3) | 33333 |
| resto = mod(100000, 3) | 1 |
| Parcela 1 | R$ 333,33 |
| Parcela 2 | R$ 333,33 |
| Parcela 3 (base + resto = 33334) | R$ 333,34 |
| Soma | R$ 1.000,00 |
Outro exemplo, R$ 100,00 em 3 vezes: 10000 ÷ 3 = 3333 com resto 1, então as parcelas são 33,33, 33,33 e 33,34.
- O nome
Aplicar_a_cadanas expressões deve ser igual ao nome da ação no seu fluxo (espaços viram sublinhado). Se renomear, ajuste. - Se o valor vier de texto digitado por pessoas no padrão brasileiro, limpe antes de converter. Testado:
float('1,5')devolve15(a vírgula é descartada, sem erro!) efloat('1.234,56')dá erro. A limpeza abaixo resolve1.234,56e1000,50, mas só serve para texto com vírgula decimal: aplicada a1000.50, devolve 100050.float(replace(replace(triggerBody()?['valor'], '.', ''), ',', '.'))
Se houver "R$", retire-o antes com outroreplace. Testado comR$ 1.234,56(devolve 1234.56) e com-1.234,56(devolve -1234.56). - Valide
parcelasmaior que zero antes de dividir:divemodpor zero dão erro. - Teste com valores extremos: 0,01 em 3 parcelas (parcelas 0, 0 e 1 centavo) e um total que divide exatamente.
Antes de colar qualquer uma dessas expressões no fluxo, passe por ela no verificador de expressões: ele confere aspas, parênteses e nomes de funções em segundos.