l10n-brazil icon indicating copy to clipboard operation
l10n-brazil copied to clipboard

[12][BUG] Problema com arredondamento do ISSQN

Open marcelsavegnago opened this issue 3 years ago • 7 comments

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

marcelsavegnago avatar Sep 15 '21 15:09 marcelsavegnago

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

rpenido avatar Sep 15 '21 22:09 rpenido

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 avatar Sep 16 '21 01:09 rvalyi

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

rvalyi avatar Oct 19 '21 16:10 rvalyi

@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.

marcelsavegnago avatar Oct 20 '21 12:10 marcelsavegnago

@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.

mileo avatar Oct 20 '21 15:10 mileo

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 avatar Oct 28 '21 21:10 rvalyi

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

  • https://github.com/shopinvader/odoo-shopinvader/issues/1041
  • https://github.com/akretion/odoo-shopinvader/commit/d50f2bbbd0dcdefde5df34a3d6426f4329f03cb6
  • https://gist.github.com/odony/5269a695545902e7e23e761e20a9ec8c
  • https://gist.github.com/Sukonnik-Illia/ed9b2bec1821cad437d1b8adb17406a3

rvalyi avatar Nov 05 '21 13:11 rvalyi

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.

github-actions[bot] avatar Jul 23 '23 12:07 github-actions[bot]