Arredondamentos na NFCe

290 views
Skip to first unread message

Ian Cléver Sales Fernandes

unread,
Jan 10, 2017, 2:54:40 PM1/10/17
to NFePHP
Boa tarde a todos,

Na nos valores dos produtos e somatórios dos totais da NFCe e afins existem diversos valores em ponto flutuante, e como todos aqui que são programadores sabem os valores em ponto flutuante na maioria das linguagens de programação, se não em todas, não são exatos e é muito comum acontecerem arredondamentos para baixo ou para cima.

O que eu quero saber é se esses pequenos arredondamentos na NFC-e são aceitáveis ou se é preciso arranjar alguma forma para truncar esses valores?

Se a resposta é que não se deve usar o arredondamento(mais provável), como vocês procedem e qual é a forma mais acertada para corrigir esses pequenos "buracos"?

rtal

unread,
Jan 11, 2017, 5:35:59 AM1/11/17
to nfe...@googlegroups.com
Tenho ERP que roda em SP, PR e SC, o ERP gera o xml e repassa p/ o nfephp(não do grupo), um nfephp alternativo alterado por mim em 2013, o que percebi e que em cada estado os caras tem uma forma p/ estes arredondamentos, para livrar disso nos calculos de totais, impostos, etc eu simplesmente corto o numero depois de duas casas decimais apos a virgula, ex 12,653 = 12,65 ( e mais nada) funciona, dai eu gravo em bd, as Sefaz(es) parece-me que conferem o corpo da nota, refazendo os calculos e dai vem o problema, logo é melhor informar correto.
--
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
Para Sair do Grupo: nfephp+un...@googlegroups.com
Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
-------
Repositório: https://github.com/nfephp-org/nfephp
---
Você recebeu essa mensagem porque está inscrito no grupo "NFePHP" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nfephp+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



Este email está limpo de vírus e malwares porque a proteção do avast! Antivírus está ativa.


Thales farias martins

unread,
Jan 11, 2017, 5:42:21 AM1/11/17
to NFePHP
Bom dia Ian.

Este problema pode ocorrer se você somar valores já arredondados.
Ex:

Vamos supor que você tenha um campo tipo float no seu banco de dados que armazene o valor unitário da mercadoria.
Se você arredondar este valor e depois somar ele para obter um total e arredondar novamente ai terá problema.

$valorUnit = 10.9555555557;

$valorTotal = 0;
for ($i=1; $i < 6; $i++) {
    $valorTotal += round($valorUnit, 2);
}

var_dump(round($valorTotal,2));

$valorTotal = 0;
for ($i=1; $i < 6; $i++) {
    $valorTotal += $valorUnit;
}

var_dump(round($valorTotal,2));

Perceba que os valores ficam diferentes.

Ian Cléver Sales Fernandes

unread,
Jan 11, 2017, 7:58:11 AM1/11/17
to nfe...@googlegroups.com
Foi mais ou menos o que eu acabei deduzindo procurando por funções de classes não externas para fazer isso no php. Todas elas em alguns casos arredondam, daí eu pensei algo mais ou menos do tipo, acho que vai ser o que menos dá dor de cabeça.

Em 10 de janeiro de 2017 17:21, rtal <rt...@uol.com.br> escreveu:
Tenho ERP que roda em SP, PR e SC, o ERP gera o xml e repassa p/ o nfephp(não do grupo), um nfephp alternativo alterado por mim em 2013, o que percebi e que em cada estado os caras tem uma forma p/ estes arredondamentos, para livrar disso nos calculos de totais, impostos, etc eu simplesmente corto o numero depois de duas casas decimais apos a virgula, ex 12,653 = 12,65 ( e mais nada) funciona, dai eu gravo em bd, as Sefaz(es) parece-me que conferem o corpo da nota, refazendo os calculos e dai vem o problema, logo é melhor informar correto.
 
Sent: Tuesday, January 10, 2017 5:54 PM
To: NFePHP
Subject: [nfephp] Arredondamentos na NFCe
 
Boa tarde a todos,
 
Na nos valores dos produtos e somatórios dos totais da NFCe e afins existem diversos valores em ponto flutuante, e como todos aqui que são programadores sabem os valores em ponto flutuante na maioria das linguagens de programação, se não em todas, não são exatos e é muito comum acontecerem arredondamentos para baixo ou para cima.
 
O que eu quero saber é se esses pequenos arredondamentos na NFC-e são aceitáveis ou se é preciso arranjar alguma forma para truncar esses valores?
 
Se a resposta é que não se deve usar o arredondamento(mais provável), como vocês procedem e qual é a forma mais acertada para corrigir esses pequenos "buracos"?
--
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com

Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
-------
Repositório: https://github.com/nfephp-org/nfephp
---
Você recebeu essa mensagem porque está inscrito no grupo "NFePHP" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nfephp+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



Este email está limpo de vírus e malwares porque a proteção do avast! Antivírus está ativa.


--
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
Você recebeu essa mensagem porque está inscrito em um tópico no grupo "NFePHP" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/nfephp/Ol-zkE5T5x8/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para nfephp+unsubscribe@googlegroups.com.

Ian Cléver Sales Fernandes

unread,
Jan 11, 2017, 8:10:53 AM1/11/17
to nfe...@googlegroups.com
No meu caso aqui Thales eu estava falando quando esses valores voltam do BD para o php, no meu caso aqui uso campo decimal para esse tipo de dados.

O negócio é que se ele tiver uma quantidade de casas decimais maior do que o tamanho que eu quero por exemplo normalmente ele arredonda, mesmo sem o usar funções como round, ceil ou floor.

O negócio aqui é o seguinte, suponha que eu tenha um certo valor 2.9999 na base de dados, aí quando eu vou passar isso para o XML através do PHP eu queira apenas 2 casas decimais, então o mais comum seria usar funções com number_format, money_format, printf ou sprintf para formatar o bendito número. Só que em um caso como esse o que acontece é que eles vão gerar '2.00' , então quando eu fizer qualquer outra operação com isso o valor final vai alterar, isso acontece também com outros valores.

Ontem depois de muito quebrar a cabeça com isso percebi que o modo mais fácil de fazer isso seria mesmo truncar o número por conta própria, como o rtal falou. É isso ou usar uma biblioteca externa como a BC Math, mas para mim isso é inviável porque trabalho com servidor de hospedagem e os caras não irão deixar fazer absolutamente tudo que queremos.

rtal

unread,
Jan 11, 2017, 8:18:16 AM1/11/17
to nfe...@googlegroups.com
Trunca no segundo decimal e salva no bd com tipo de campo decimal, com qualquer numero de casas decimais por exemplo(10,4), voce não vai ter problemas nunca mais, dai é só repassar p/ o xml estes valores.
Para Sair do Grupo: nfephp+un...@googlegroups.com

Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
-------
Repositório: https://github.com/nfephp-org/nfephp
---
Você recebeu essa mensagem porque está inscrito no grupo "NFePHP" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nfephp+un...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

Júnior Machado

unread,
Jan 11, 2017, 9:23:40 AM1/11/17
to NFePHP
Boa tarde amigos.

Aqui eu trabalho da seguinte maneira, NF-e dos meus clientes são com 4 casas decimais, portanto eu faço o cálculo necessário e arredondo o valor para 5 casas decimais e removo a última casa decimal truncando novamente para 4.
Assim ele remove qualquer valor restante e mantém as 4 casas decimais, o mesmo vale pro totalizador da NFe que é 2 casas decimais, arredondo 3 e trunco em 2. Nunca tive problema de validação do XML e nem de valores.

O mesmo acaba valendo pro NFC-e.

Roberto Machado

unread,
Jan 11, 2017, 12:15:30 PM1/11/17
to nfe...@googlegroups.com
Faço praticamente a mesma coisa que o Junior e como ele nunca tive problemas desde 2008.

Outro detalhe que que na minha base de dados todos os valores são gravados em decimais e não como FLOAT, isso também acaba facilitando os cálculos.

Roberto

Reply all
Reply to author
Forward
0 new messages