l10n-brazil
l10n-brazil copied to clipboard
[12][BUG] Problema com arredondamento do ISSQN
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
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
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.
@marcelsavegnago vc não corrigiu esse aqui https://github.com/OCA/l10n-brazil/pull/1655 ?
@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 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.
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
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
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.