[IRPF-Livre] Possível erro em src/serpro/ppgd/negocio/Valor.java impacta todas as operações
Alexandre Oliva
lxoliva en fsfla.org
Lun Mayo 20 08:55:31 UTC 2024
Oi, Adonay,
Imensas desculpas pela demora pra conseguir olhar isso. Como já falei
em outros meios, andei super ocupado me preparando pro LibrePlanet, e só
neste fim de semana consegui começar a olhar pro IRPF-Livre.
On Apr 14, 2024, Adonay Felipe Nogueira <adfeno.7046 en gmail.com> wrote:
> Boas notícias, a revisão r19528 parece resolver o problema da perda de
> precisão.
Pra mim aconteceu o contrário. O IRPF-Livre com essas modificações está
me dando 3 centavos de desconto no imposto devido, comparado com o de
referência, e a conta que eu fiz na calculadora concorda com o programa
de referência.
Dividir por 100 para só depois aplicar o percentual, num valor com
limitação de precisão, vai necessariamente perder precisão.
Não encontrei fundamento jurídico nem técnico para essa truncagem
prévia. Posso perguntar de onde veio essa ideia?
Notei que a alíquota de 27,5%, na qual esbarrei no problema, aumentava a
precisão para fazer o cálculo, mas esse aumento de precisão foi
descartado. Recomendo fortemente trazê-lo de volta.
Talvez seja até o caso de estendê-lo às demais alíquotas, como no
patchlet a seguir. Isso passa nos seus testes?
Se não, receio que talvez precisemos tentar reproduzir exatamente a
forma de cálculo atual. Hoje em dia há algumas complicações com faixas
e limites variando entre os meses do mesmo ano, e imagino que algumas
das diferenças possam surgir daí. Mas não explicaria as divergências
tão gritantes que você apontou.
Uma hipótese que me ocorre é que tenham mudado a forma de cálculo em
2021, e talvez ali os resultados tenham começado a divergir.
Isso sugeriria que os anos anteriores também estavam dando números
menores para alíquotas com 3 casas decimais. Notei que fui eu quem
introduziu o código pras alíquotas 7,5% e 22,5% em 2010, então, ao
contrário de minha suspeita anterior, isso não é código do IRPF2007.
É bem capaz que eu não tenha testado adequadamente essas modificações.
Se estou entendendo direito agora, talvez a alíquota de 15% nem precise
da precisão adicional, pois 0,15 só tem duas casas. Faz sentido, pelo
que você investigou do código?
diff --git a/src/serpro/ppgd/irpf/ModeloDeclaracao.java b/src/serpro/ppgd/irpf/ModeloDeclaracao.java
index 3a19baa24f9ef..df32639aff268 100644
--- a/src/serpro/ppgd/irpf/ModeloDeclaracao.java
+++ b/src/serpro/ppgd/irpf/ModeloDeclaracao.java
@@ -61,37 +61,41 @@ public abstract class ModeloDeclaracao extends ObjetoNegocio
else if (_baseCalculo.comparacao ("<=", LIMITE_ANUAL_15_PORCENT))
{
Valor imposto = new Valor ();
- imposto.append ('+', _baseCalculo);
- imposto.append ('/', "100,00");
- imposto.append ('*', "7,5");
+ imposto.setConteudo (_baseCalculo);
+ imposto.converteQtdCasasDecimais (3);
+ imposto.setConteudo (imposto.operacao ('*', "0,075"));
imposto.append ('-', DESCONTO_7_MEIO_PORCENT);
+ imposto.converteQtdCasasDecimais (2);
retorno.setConteudo (imposto);
}
else if (_baseCalculo.comparacao ("<=", LIMITE_ANUAL_22_MEIO_PORCENT))
{
Valor imposto = new Valor ();
- imposto.append ('+', _baseCalculo);
- imposto.append ('/', "100,00");
- imposto.append ('*', "15");
+ imposto.setConteudo (_baseCalculo);
+ imposto.converteQtdCasasDecimais (3);
+ imposto.setConteudo (imposto.operacao ('*', "0,15"));
imposto.append ('-', DESCONTO_15_PORCENT);
+ imposto.converteQtdCasasDecimais (2);
retorno.setConteudo (imposto);
}
else if (_baseCalculo.comparacao ("<=", LIMITE_ANUAL_27_MEIO_PORCENT))
{
Valor imposto = new Valor ();
- imposto.append ('+', _baseCalculo);
- imposto.append ('/', "100,00");
- imposto.append ('*', "22,5");
+ imposto.setConteudo (_baseCalculo);
+ imposto.converteQtdCasasDecimais (3);
+ imposto.setConteudo (imposto.operacao ('*', "0,225"));
imposto.append ('-', DESCONTO_22_MEIO_PORCENT);
+ imposto.converteQtdCasasDecimais (2);
retorno.setConteudo (imposto);
}
else
{
Valor imposto = new Valor ();
- imposto.append ('+', _baseCalculo);
- imposto.append ('/', "100,00");
- imposto.append ('*', "27,5");
+ imposto.setConteudo (_baseCalculo);
+ imposto.converteQtdCasasDecimais (3);
+ imposto.setConteudo (imposto.operacao ('*', "0,275"));
imposto.append ('-', DESCONTO_27_MEIO_PORCENT);
+ imposto.converteQtdCasasDecimais (2);
retorno.setConteudo (imposto);
}
return retorno;
--
Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/
Free Software Activist GNU Toolchain Engineer
Disinformation flourishes because many people care deeply about injustice but
very few check the facts. Think Assange & Stallman. The empires strike back
Más información sobre la lista de distribución Softwares-impostos