Solução completa · Power Automate

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

Passo a passo

Suponha que o fluxo receba valor (por exemplo, 1000.00), parcelas (por exemplo, 3) e a data da primeira cobrança.

  1. Variável inteira parcelas, com o valor:
    int(triggerBody()?['parcelas'])
  2. 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 vira 100000. A cultura en-US garante o ponto como separador, independentemente da configuração regional do fluxo. Se o valor vier com mais de duas casas, o formatNumber arredonda para duas, mas o arredondamento de metades não é uniforme (testado: formatNumber(0.125, '0.00') devolve 0.13 e formatNumber(2.675, 'F2') devolve 2.67). Limite as casas decimais na origem.
  3. Variável base (valor de cada parcela, em centavos):
    div(variables('totalCentavos'), variables('parcelas'))
  4. Variável resto:
    mod(variables('totalCentavos'), variables('parcelas'))
  5. Aplicar a cada sobre a sequência de 1 até o número de parcelas:
    range(1, variables('parcelas'))
    O range(1, 3) devolve [1, 2, 3] (a partir do 1, na quantidade informada).
  6. 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'))
  7. 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.
  8. 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, prefira addToTime(data, número, 'Month'), que respeita o calendário.
Executado no Power Automate: o fluxo deste guia (variáveis, 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)

ItemResultado
totalCentavos100000
base = div(100000, 3)33333
resto = mod(100000, 3)1
Parcela 1R$ 333,33
Parcela 2R$ 333,33
Parcela 3 (base + resto = 33334)R$ 333,34
SomaR$ 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.

Cuidados:
  • O nome Aplicar_a_cada nas 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') devolve 15 (a vírgula é descartada, sem erro!) e float('1.234,56') dá erro. A limpeza abaixo resolve 1.234,56 e 1000,50, mas só serve para texto com vírgula decimal: aplicada a 1000.50, devolve 100050.
    float(replace(replace(triggerBody()?['valor'], '.', ''), ',', '.'))
    Se houver "R$", retire-o antes com outro replace. Testado com R$ 1.234,56 (devolve 1234.56) e com -1.234,56 (devolve -1234.56).
  • Valide parcelas maior que zero antes de dividir: div e mod por 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.

Ferramentas para usar com este guia

Fontes oficiais