[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