dimesum

Início / Blog / Engenharia

Engenharia

Arredondamento na divisão de contas: app e planilha diferem

· 12 min de leitura ·

Uma conta de $100,00 dividida por três deixa um centavo que a planilha perde e o Dimesum dá a uma pessoa, escolhida por um hash fixo da conta. Aqui está a tabela calculada, a regra que substituímos e os dois erros de moeda que só uma planilha consegue cometer.

A sua planilha diz $66,66 e o app diz $66,67. Esse único centavo é o arredondamento na divisão de contas, e é a mensagem mais comum que recebemos de quem conferiu o Dimesum com o Excel. A resposta curta: a planilha arredonda cada parte separadamente e perde o centavo que sobra, enquanto o Dimesum entrega esse centavo a uma pessoa, escolhida por um hash fixo da conta, para que as partes sempre somem de volta o total.

O problema, a causa e a correção, em três frases que você pode copiar. Uma conta de $100,00 dividida por três não pode ser paga em três valores iguais, então alguém fica com $33,34. Uma planilha que arredonda cada célula mostra $33,33 três vezes e perde um centavo em silêncio, enquanto o Dimesum mantém o centavo e decide quem fica com ele pelo hash da própria conta. Os dois vão concordar em toda conta que se divide por igual e diferir em no máximo um centavo por pessoa em toda conta que não se divide.

O sintoma: um centavo que um lado tem e o outro não

O relato normalmente chega do mesmo jeito. Alguém exporta um mês de contas, refaz os saldos numa planilha e encontra alguns centavos de diferença. Nada falta de nenhum dos lados em mais de um centavo por conta, e mesmo assim ninguém consegue fazer os dois baterem.

Escrevemos sobre os quatro motivos pelos quais o saldo de um grupo parece errado em por que os saldos compartilhados nunca fecham. Este texto pega o primeiro deles, o centavo arredondado, e o segue até uma planilha, porque é para lá que uma pessoa cuidadosa vai para nos conferir. Ele também cobre os dois lugares em que uma planilha erra e um app não consegue errar: somar duas moedas numa coluna e dar ao iene duas casas decimais que ele não tem.

Uma conta de $100,00, dividida por três, numa planilha e no app

A Emma paga $100,00 pelo jantar. O Lucas, a Sofia e a Emma dividem igualmente. Cem dólares divididos por três dão $33,333 e assim por diante para sempre, o que nenhum cartão consegue pagar.

Uma planilha consegue guardar esse número sem fim. Digite =100/3 em três células, formate com duas casas decimais, e cada uma mostra $33,33. A célula de SOMA mostra $100,00, porque soma os dígitos escondidos e não os que estão na tela. Agora alguém soma as três células visíveis numa calculadora e chega a $99,99.

A planilha cuidadosa arredonda: =ROUND(100/3, 2) em cada célula (ARRED, no Excel em português). Agora cada célula realmente guarda $33,33, a SOMA realmente é $99,99, e o centavo saiu da planilha. O Lucas deve $33,33 à Emma e a Sofia também, então a planilha diz que ela recebe $66,66 de volta. A parte dela deveria ser $33,33, mas ela pagou $33,34 do jantar sem que ninguém anotasse.

Um jantar de $100,00, pago pela Emma, dividido por três: duas planilhas e duas contas do Dimesum
Onde foi divididoParte da EmmaParte do LucasParte da SofiaAs partes somamA Emma tem a receber
Dimesum, uma conta cujo hash dá o centavo extra à Emma$33,34$33,33$33,33$100,00$66,66
Dimesum, uma conta cujo hash dá o centavo extra ao Lucas$33,33$33,34$33,33$100,00$66,67
Planilha, =100/3 exibido com duas casas$33,33$33,33$33,33$100,00 na SOMA, $99,99 na tela$66,67 na tela
Planilha, =ROUND(100/3, 2)$33,33$33,33$33,33$99,99$66,66

Cada linha é aritmética que você pode refazer.

Na segunda linha do Dimesum, o Lucas deve $33,34 e a Sofia deve $33,33, e $33,34 mais $33,33 dá $66,67. Na planilha arredondada, $33,33 mais $33,33 dá $66,66. Nenhum dos dois é um erro. São duas regras diferentes sobre um centavo, e só uma delas mantém o centavo no registro.

Por que cada parte é arredondada para baixo primeiro

O Dimesum divide pelo método dos maiores restos, uma regra que alguns parlamentos usam para transformar proporções de votos em cadeiras inteiras. Cada valor é guardado como um número inteiro da menor unidade da moeda, então $100,00 são 10.000 centavos. A parte exata de cada pessoa é calculada como fração, e depois todos recebem os centavos inteiros abaixo dela: 3.333 cada, o que dá 9.999.

Isso deixa um centavo. Os centavos que sobram são distribuídos um de cada vez, para as pessoas cujas frações foram mais cortadas. Numa divisão igual, a fração de todos é a mesma, um terço de centavo, então a regra precisa de um critério de desempate. Foi nesse critério que a nossa primeira versão errou.

A garantia que o método dá é a que uma planilha não consegue dar: as partes somam de volta o total exatamente, e nenhuma parte fica mais de um centavo longe do seu valor exato. A mesma aritmética roda para uma divisão igual, uma divisão por porcentagem, partes com pesos, cada linha de uma conta por item e cada fundo de imposto ou gorjeta dela. O nosso texto sobre apps para dividir uma conta por item mostra isso num jantar de quatro pessoas com desconto.

O que tentamos primeiro: o membro mais antigo ficava com todo centavo extra

O primeiro critério de desempate foi o óbvio. Os membros são ordenados por quando entraram, então os empates iam para o membro mais antigo. É determinístico, é fácil de testar, e em nenhuma conta isolada alguém poderia chamá-lo de injusto.

Ao longo de um ano, é uma sobretaxa. Um apartamento com três pessoas divide aluguel, luz, internet e mercado, e muitas dessas contas deixam um centavo sobrando. Cada um desses centavos ia para a mesma pessoa, quem criou o grupo. Um centavo não é nada; algumas centenas deles na mesma direção são um padrão que alguém acaba notando numa planilha.

A resposta do fundador em 21 de agosto de 2026 foi que um participante aleatório deveria ficar com ele, para que isso se equilibrasse ao longo de muitas contas. Aleatório tinha um problema para nós. O Dimesum recalcula a divisão de uma conta sempre que ela é editada, e uma edição é registrada como um novo lançamento que refaz a divisão, como descrito em por que uma edição precisa refazer sua divisão. Com um sorteio aleatório de verdade, uma edição que mudasse só o nome da conta sortearia de novo, moveria o centavo para outra pessoa e lançaria uma correção por um dinheiro que nunca se mexeu.

A correção: girar o centavo extra por um hash fixo da conta

Então o aleatório virou pseudoaleatório e fixo. Cada conta tem o seu próprio identificador, e nós o passamos pelo FNV-1a, um hash pequeno que dá a mesma resposta em toda máquina e em toda versão. O hash escolhe em que ponto da lista ordenada os centavos que sobram começam a ser distribuídos. Mesma conta, mesma resposta, toda vez que ela é calculada; ao longo de muitas contas, o ponto de partida cai em cada pessoa mais ou menos igualmente.

A lista ordenada continua sendo a ordem dos maiores restos, com empates resolvidos pelo membro mais antigo primeiro. O hash só muda onde a distribuição começa. Numa divisão igual por três, isso significa que cada conta escolhe uma das três pessoas para ficar com $33,34, e essa escolha nunca muda para aquela conta.

É por isso que a sua planilha e o app discordam de jeitos diferentes em contas diferentes. Num jantar de $100,00, o hash dá o centavo à Emma e os dois concordam que ela tem $66,66 a receber. No seguinte, ele dá o centavo ao Lucas e o app diz $66,67. Uma planilha com uma única regra para todas as linhas não consegue reproduzir isso, a menos que copie o hash.

O custo que aceitamos

Duas contas com conteúdo idêntico podem agora diferir em um centavo. Dois jantares de $100,00 com as mesmas três pessoas podem se dividir com $33,34 para a Emma num e $33,34 para a Sofia no outro. Dois dos nossos próprios testes de ponta a ponta comparavam as partes de uma conta com as de outra e quebraram no dia em que isso entrou no ar; agora eles conferem o resultado da regra.

Achamos que essa é a troca certa. O registro por baixo de cada saldo é somente de acréscimos, então um centavo que se mexesse sem motivo ficaria escrito para sempre; o design está em o registro somente de acréscimos por trás de cada divisão. Um centavo fixo por conta e espalhado entre as pessoas nunca precisa de correção.

Uma coluna que soma dólares e euros não é um total

A segunda diferença é maior que um centavo, e é sempre da planilha. Numa viagem, a Emma paga uma noite de hotel de €90 e um ingresso de museu de $60, e a planilha tem uma única coluna Valor com uma SOMA embaixo. Ela diz 150. Esse número não tem moeda, então ninguém pode devê-lo.

O Dimesum mantém cada saldo por moeda e nunca soma entre elas. O grupo vê o que se deve em euros e, separadamente, o que se deve em dólares. Se o grupo combinar uma taxa, o Dimesum pode mostrar os saldos consolidados numa moeda, com a taxa indicada, e a dívida em si continua na moeda em que foi gasta.

Os erros que surgem de fazer diferente estão em os erros de dinheiro que uma segunda moeda causa. Se uma viagem é o motivo da sua comparação, apps para dividir despesas em várias moedas mostra como outros apps guardam uma segunda moeda.

Consolidar traz de volta um arredondamento próprio. Uma conversão arredonda para centavos inteiros, metade para longe do zero, então saldos que somavam zero em ienes podem somar um centavo a mais em dólares. Deixamos o membro de menor identificador absorver até uma menor unidade por conversão, e além disso o plano de acerto é recusado. Um plano errado em $1 sem ninguém perceber é pior do que um erro, porque alguém o pagaria.

O iene não tem centavos, e uma planilha dá dois a ele mesmo assim

A terceira diferença aparece em toda viagem ao Japão. O iene não tem subunidade: o seu expoente na norma de moedas ISO 4217 é zero, então ¥1 é o menor valor que alguém pode pagar. Um jantar de ¥10.000 dividido por três no Dimesum sai como ¥3.334, ¥3.333 e ¥3.333, que somam ¥10.000.

Uma planilha formatada para dinheiro mostra ¥3.333,33 três vezes, um valor que nenhuma moeda paga. Arredonde para ienes inteiros e ela mostra ¥3.333 três vezes, que somam ¥9.999. O iene perde uma unidade do mesmo jeito que o dólar perdeu um centavo.

Nós mesmos quebramos isso antes de consertar.

O código que lê um valor numa linha de texto uma vez o transformava em subunidades multiplicando por 100, o que está certo para dólares e euros e errado para ienes: um táxi de ¥2.000 virou ¥200.000. Foi um erro de 100 vezes, e nenhuma regra de arredondamento poderia tê-lo pegado.

A conversão agora lê o expoente de cada moeda na tabela da ISO, e um valor mais fino do que a menor unidade de uma moeda é recusado em vez de arredondado. Ler valores em texto tem uma história mais longa conosco, contada em por que apagamos o nosso analisador de despesas. Como uma viagem em ienes se divide sem esse problema está em apps de divisão de contas no Japão.

O que mais uma planilha faz com dinheiro

O Excel guarda números em ponto flutuante binário, e alguns decimais não têm forma binária exata. A própria nota da Microsoft sobre aritmética de ponto flutuante no Excel explica por que uma soma pode sair um fio diferente do valor esperado. Na maior parte do tempo a exibição esconde isso, e é exatamente por isso que a célula que você vê e o valor que você soma podem ser diferentes.

As funções de arredondamento também têm regras próprias. A função ARRED (ROUND) do Excel e o ARRED do Google Planilhas arredondam cada célula sozinha, sem saber nada das outras células da divisão. Essa é toda a diferença: uma divisão precisa arredondar as partes juntas, para que elas continuem somando o valor da conta.

O Dimesum nunca guarda dinheiro como fração de uma unidade. Cada valor é um número inteiro de centavos, ou de ienes, com a moeda escrita ao lado, e cada divisão conserva o seu total exatamente. Se você ainda prefere manter o dinheiro do grupo numa planilha, o nosso modelo de planilha de despesas compartilhadas é um bom começo, e planilha ou app para despesas compartilhadas mostra onde a planilha deixa de bastar.

Como fazer a sua planilha concordar com o app

Você consegue reproduzir os números do Dimesum à mão. Trabalhe em centavos inteiros. Dê a cada pessoa os centavos inteiros abaixo da parte exata dela, conte os centavos que sobram e distribua-os um de cada vez.

  1. Converta a conta em centavos: $100,00 são 10.000.
  2. Dê a cada pessoa o piso da parte exata dela: 3.333 cada, 9.999 ao todo.
  3. Entregue o centavo que sobra à pessoa que o app mostra com ele, e confira se as partes somam 10.000.
  4. Mantenha uma planilha por moeda, e nunca coloque uma SOMA que atravesse duas delas.

O passo três é o único que você não consegue prever sem o hash da conta, então leia-o na própria conta. A aritmética mais longa para qualquer divisão, com pesos e porcentagens, está em o método de calculadora para dividir despesas, e a mesma conferência aplicada ao histórico inteiro de um grupo está em como acompanhar quem deve a quem numa viagem.

O que isso ainda não consegue fazer

Não consegue fazer a sua planilha e o app concordarem em toda conta sem esforço. Uma planilha com uma regra de arredondamento por coluna vai diferir do Dimesum em um centavo em mais ou menos toda conta que deixa resto, e a pessoa que fica com o centavo vai mudar de conta para conta. Essa é a regra funcionando.

Também não consegue tornar exato um total consolidado. Um saldo mostrado numa moeda a uma taxa combinada é indicativo, e o plano de acerto montado a partir dele pode errar em uma menor unidade por conversão. A dívida que vale continua na moeda em que foi gasta, e é por isso que acertar as contas de um grupo acontece uma moeda de cada vez.

Confira a soma, não cada célula

Quando o app e a sua planilha discordarem em um centavo, some as partes da conta: se elas derem o total, o centavo está com uma pessoa de propósito. Para ver com quem, abra o Dimesum, toque na conta e leia a parte que tem um centavo a mais que as outras.

Perguntas frequentes

Por que o meu app de divisão difere do Excel em um centavo?

Porque o Excel arredonda cada parte separadamente e o app arredonda as partes juntas. Uma conta de $100,00 dividida por três vira $33,33 três vezes numa planilha arredondada, o que soma $99,99. O Dimesum dá $33,34 a uma pessoa para que as partes somem $100,00, e um hash fixo da conta decide quem fica com esse centavo.

Quem paga o centavo extra quando uma conta é dividida por três?

Uma pessoa, e no Dimesum o hash da própria conta decide qual. As partes são calculadas pelo método dos maiores restos, e o ponto em que os centavos que sobram começam a ser distribuídos gira conforme um hash fixo da conta. A mesma conta sempre dá a mesma resposta, e ao longo de muitas contas o centavo cai em cada pessoa mais ou menos igualmente.

Por que o Dimesum não sorteia uma pessoa para o centavo extra?

Porque um sorteio aleatório de verdade mudaria o centavo toda vez que uma conta fosse editada. O Dimesum refaz a divisão a cada edição, então um novo sorteio lançaria uma correção por um dinheiro que nunca se mexeu. Um hash fixo da conta se comporta como uma escolha aleatória ao longo de muitas contas e dá sempre a mesma resposta para cada conta.

Posso somar saldos em duas moedas numa mesma coluna da planilha?

Não, o total não significa nada. €90 e $60 somados dão 150, um número sem moeda, então ninguém pode devê-lo. O Dimesum mantém um saldo por moeda e nunca soma entre elas; um grupo pode vê-los consolidados a uma taxa que ele combina, com essa taxa indicada, enquanto cada dívida fica na moeda em que foi gasta.

Como o Dimesum divide ienes se não há centavos?

Em ienes inteiros, porque a menor unidade do iene é ¥1. Um jantar de ¥10.000 dividido por três dá ¥3.334, ¥3.333 e ¥3.333, que somam ¥10.000. Uma planilha formatada com duas casas decimais mostra ¥3.333,33, que nenhuma moeda consegue pagar, e arredondar cada célula para ienes inteiros perde ¥1 do mesmo jeito que uma planilha em dólares perde um centavo.