OCA / l10n-brazil

Localização brasileira oficial do Odoo.
https://odoo-community.org/psc-teams/brazil-66
GNU Affero General Public License v3.0
237 stars 243 forks source link

[12][BUG] Problema com arredondamento do ISSQN #1634

Closed marcelsavegnago closed 1 year ago

marcelsavegnago commented 3 years ago

ValorServicos: R$ 17867.8 Aliquota: 2.5%

2,5% da o montante de R$ 446,695 e ao arredondar pelo sistema dá o valor de R$ 446,69 que em tese deveria ser R$ 446,70

Estou investigando melhor mas já deixo aqui o registro da questão.

Provedor impactado: ISSNET

rpenido commented 3 years ago

No python 3 o round() arredonda para o par mais próximo. Isso é conhecido como "round half to even", ou "bankers' rounding".

O objetivo é evitar viés para cima da soma de sucessíveis arredondamentos.

Para arredondar 5 sempre para cima, é preciso implementar uma função como abaixo:

def round_up(n, decimals=0):
  multiplier = 10 ** decimals
  return math.ceil(n * multiplier) / multiplier

PS: Pra floating (como no exemplo), como a representação não é exata, é um pouquinho mais complicado (a função acima ainda vai funcionar). A documentação do python explica isso: https://docs.python.org/release/3.1.5/library/functions.html#round

rvalyi commented 3 years ago

Tem esse tipo de recurso no Odoo no float_utils passando o método rounding_method='UP' https://github.com/odoo/odoo/blob/8f6430359b347d3669a536eca0a297c66ce99163/odoo/tools/float_utils.py#L37 agora eu não sei se o problema seria esse mesmo. Sendo que o Odoo usa floats e não decimals é fácil rolar erros de aredondamento. Até onde eu sei é sempre possível de resolver mas as vezes obriga a fazer coisas com rigor de cálculo científico com epsilons onde o cálculo seria trivial se fosse usar decimals. Mas enfim essa escolha pelos floats tá muito no sangue do Odoo e temos que assumir essa escolha TB e ter esse rigor nos cálculos então.

rvalyi commented 2 years ago

@marcelsavegnago vc não corrigiu esse aqui https://github.com/OCA/l10n-brazil/pull/1655 ?

marcelsavegnago commented 2 years ago

@rvalyi a #PR 1655 resolve somente parte do problema. No caso precisaria ainda implementar algo como citado acima pelo @rpenido. Se possíve,l deixa a Issue em aberto ainda.

mileo commented 2 years ago

@marcelsavegnago tenta usar o parametro UP: https://github.com/odoo/odoo/blob/8f6430359b347d3669a536eca0a297c66ce99163/odoo/tools/float_utils.py#L50

Na folha de pagamento tivemos muitos problemas referentes a arredondamento.

@lfdivino pode conseguir falar mais sobre isso.

rvalyi commented 2 years ago

como o assunto foi falado de novo hoje, então eu anexo alguns links:

1 - o problema fondamental de usar Float para os valores financeiros (decimais): https://docs.python.org/3/tutorial/floatingpoint.html 2 - as consequências no Odoo: https://github.com/odoo/odoo/issues/7024 https://github.com/odoo/odoo/issues/72826 ... 3 - comentários do Fabien hoje sobre: https://twitter.com/legalsylvain/status/1453770631665831953

rvalyi commented 2 years ago

mais links sobre isso caso isso seja um problema para alguém:

github-actions[bot] commented 1 year ago

There hasn't been any activity on this issue in the past 6 months, so it has been marked as stale and it will be closed automatically if no further activity occurs in the next 30 days. If you want this issue to never become stale, please ask a PSC member to apply the "no stale" label.