Pesquisar na Comunidade
Showing results for tags 'roundabnt'.
Encontrado 3 registros
-
A exception é gerada ao tentar arredondar o nr 9.41212959024529 em 10 casas. RoundABNT(9.41212959024529,-10) Debugando percebi que na verdade a exception e gerada em uma função do Delphi a SimpleRoundTo. Na unit ACBrUtil na linha 580. PowValue := SimpleRoundTo( FracValue * 10 * Pow, -9) ; // SimpleRoundTo elimina dizimas ; A versão do Delphi que eu uso e a XE. Não sei se em outras versões ou se no Lazarus também ocorre essa exception.
- 4 replies
-
- roundabnt
- simpleroundto
- (e 1 mais)
-
Nunca mandei nada para correção, então não sei como fazer isso, gostaria que se tiver uma forma melhor de fazer que me notifiquem. Na função do RoundABNT, na verificação das regras 2.3 e 2.4 ( regra do par ou ímpar), era observado o valor errado para verificar se o mesmo era par ou ímpar. Regras: function RoundABNT(const AValue: Double; const Digits: SmallInt): Double; var Pow, PowValue, RestPart, FracValue : Extended; IntCalc, FracCalc, LastNumber, IntValue : Int64; Begin Pow := intpower(10, abs(Digits) ); PowValue := AValue / 10 ; IntValue := trunc(PowValue); FracValue := frac(PowValue); PowValue := SimpleRoundTo( FracValue * 10 * Pow, -9) ; // SimpleRoundTo elimina dizimas ; IntCalc := trunc( PowValue ); FracCalc := trunc( frac( PowValue ) * 100); if (FracCalc > 50) then Inc( IntCalc ) else if (FracCalc = 50) then begin LastNumber := trunc( frac( IntCalc / 100) * 10); if odd(LastNumber) then Inc( IntCalc ) else begin RestPart := frac( PowValue * 10 ) ; if RestPart > 0 then Inc( IntCalc ); end ; end ; Result := ((IntValue*10) + (IntCalc / Pow)); end; Alterada a linha: Na variável LastNumber era salvo o ultimo número a ser considerado e na verdade era pra ser salvo o ultimo número anterior a ele. A regra realmente é confusa, mas (infelizmente) existe e temos que segui-la.
-
Falha de arredondamento na função RoundABNT
um tópico no fórum postou renesul NFC-e - Nota Fiscal do Consumidor Eletrônica
Uso o ecfvirtual para gerar NFC-e e SAT com o delphi 7. Ao aplicar um desconto de por exemplo R$ 2,00 na venda de um item é enviado pela procedure TACBrECFVirtualClassCupom.DescAresItem(NumItem: Integer; ADescAcres: Double O desconto de 2 reais é passado como -2 para a função RoundABNT que retorna o valor de -1,99 e não -2 que é esperado. Passar número negativo para para função RoundABNT pode retornar erro enquanto números positivos funcionam normal. Abaixo alteração que resolveu o problema pontualmente. --- ACBrECFVirtual.pas (revision 11135) +++ ACBrECFVirtual.pas (working copy) @@ -1016,8 +1016,14 @@ if ItemCupom.DescAcres <> 0 then raise EACBrECFERRO.create(ACBrStr('Item ('+IntToStrZero(NumItem,3)+') já recebeu Desconto ou Acrescimo.')) ; + if ADescAcres < 0 then + ADescAcres := ADescAcres * -1; + ItemCupom.DescAcres := RoundABNT( ADescAcres, -2); + if ADescAcres > 0 then + ADescAcres := ADescAcres * -1; + fpSubTotal := fpSubTotal + ItemCupom.DescAcres; // Atualiza SubTotal Cupom end;