Ajuda - Busca - Membros - Calendário
Versão Completa: Problemas Com Arredondamento Em Ecfs

Google
FórumWEB > Desenvolvimento > Automação Comercial
ronnei
Ola Amigos, estou com um problema chato, eu tenho um cliente que tem supermercado e ele tem produtos pesados, que na etiqueta gerada pela balança vem apenas o produto e o valor total, ou seja, o peso eu tenho que descobrir via calculos, sendo assim, imagine a situacao

O produto custa 1,99 o kg e na etiqueta o valor total deu 2,17, sendo assim

2,17/1,99 = 1,090452261 ->pquantidade:=RoundTo(strtofloat(pquantidade),-3);
no round ele fica 1,09

soh que 1,09*1,99=2,1691

nesse caso o meu sistema arrendoda o 2,1691 para 2,17 que é o valor da etiqueta
soh que a impressora nao, ela arredonda para 2,16

ou seja, ela esta arredondando a 3º caso que era um 9 para baixo. Alguem sabe o que eu posso fazer para resolver?

O problema acontece na Sweda e na Bematech.
Daniel Simões
Isso é o normal em ECFs que apenas Truncam o Valor (todos os MFDs)

Uma das soluções é soma 0,001 a QTD até que o Valor Truncado fique igual ao valor Arredondado
ronnei
Eu ja tinha imaginado isso mesmo, eu pensei que poderia mudar a forma de arredondamento nas ECFS

QUOTE(Daniel Simões @ 21-Jan-2008, 14:39) *
Isso é o normal em ECFs que apenas Truncam o Valor (todos os MFDs)

Uma das soluções é soma 0,001 a QTD até que o Valor Truncado fique igual ao valor Arredondado
Pitocco
Oi Ronnei, Daniel e amigos do Fórum.

As bibliotecas matemáticas linguagens de programação adotam o método de arredondamento onde: se o final for 5 ou maior incrementa-se 1 no valor do dígito a esquerda ou se o final for menor igual ou menor que 4 "nada" é incrementado ao dígito da esquerda. Este método é o mais usado em cálculos de estatística (segundo um professor de estatística da faculdade).

Eu adotei o valor 0.004 ou invés de 0.001 apenas para padronizar o arredondamento para cima, isto é, se há valor maior que ZERO no dígito da direita, seja ele igual ou menor a 5, ele sempre será arredondado, incrementando 1 ao valor do dígito da esquerda.

O motivo de eu ter adotado o valor 0.0004 (para cálculos com 4 dígitos decimais) foi a emissão de notas fiscais.
São "trocentos" cálculos envolvendo valores de produtos, impostos e descontos que na maioria das vezes havia um erro de 0,01 centavo ao se fazer o cálculo na calculadora. As calculadoras trabalham com um número maior de casas decimais, daí o problema.
No VB, se você não atentar para isto, não terá sucesso no arredondamento dos valores. dry.gif

Exemplo para cálculo com 3 dígitos decimais:
valor 1.570 - último dígito é menor que 5 então ficará: 1.570 + 0.004 = 1.574 - não será arredondado.
valor 1.571 - último dígito é menor que 5 então ficará: 1.571 + 0.001= 1.572 - não será arredondado.
valor 1.571 - último dígito é menor que 5 então ficará: 1.571 + 0.004= 1.575 - será arredondado para cima.
valor 1.574 - último dígito é menor que 5 então ficará: 1.574 + 0.004 = 1.578 - será arredondado para cima.
valor 1.579 - último dígito é maior que 5 então ficará: 1.579 + 0.004 = 1.583 - não será arredondado mas já houve o incremento de 1 no dígito da esquerda.
O valor 1.574 retornará 1.57 se for usado uma máscara ou se for truncado (sem arredondamento).
O valor 1.583 retornará 1.58 se for usado uma máscara ou se for truncado (sem arredondamento).
Os valores 1.575 e 1.578 serão arredondados para 1.58 se for usado uma máscara ou se forem truncados.

Resultado com e sem a adição do valor 0.004:
Sem a adição de 0.004: 1.574 se truncado por uma mascará (ex: R$ ######0.00) retornará R$ 1.57
Com a adição de 0.004: 1.574+0.004=1.578, se truncado por uma mascará (ex: R$ ###.##0,00) retornará R$ 1,58.

Na minha AC, desde o início eu adotei um modo "bizarro" de driblar o arredondamento devido as ECFs.
- Faço todos os cálculos utilizando 4 dígitos decimais e adicionando o valor 0.0004 ao resultado.
- Converto o valor para uma string no seguinte formato "########0.0000".
- Pego este sguimento da string: "########0.00", desprezando os 2 últimos dígitos.
- Converto o conteúdo da string para uma variável numércia e pronto, o arredondamento fica preciso.
- Posso utilizar tanto a variável string ou a variável numérica para enviar a qualquer dispositivo.
Criei funções para realizar este trabalho e as utilizo em todas as rotinas do sistema.

Se alguém não concordar com o valor 0.004 ou 0.0004 saiba que está correto utilizar 0.001 ou 0.0001 sugerido pelo Daniel. thumbsup.gif
Apenas quis mostrar a vocês uma outra visão de arredondamento.
ronnei
Certo Pitocco a idéia é valida!! Obrigado pela sugestão!!
JNPace
Olá a todos, sugestão para Truncar o valor e não arredondar...
CODE
Vlr_Item:=trunc(((Quantidade * Unitário) * 100) + 0.0009) / 100;
Gabriel Fernandes
Post do Topico -> Arredondamento X Truncamento

Pessoal,

Este problema de arredondamento/truncamento é simples de resolver, no nosso sistema fizemos assim:

Capture valores da etiqueta da balança, a partir destas informações é fácil descobrir se ela está arredondando ou truncando;
Descubra se o ECF esta usando o mesmo cálculo que a balança, caso sim basta enviar os valores para o ECF.
Caso estejam divergentes devemos ir variando a quantidade, até chegarmos no valor total do cálculo que o ECF irá fazer.
Mesmo assim, porém raramente, temos situações em que não é possível chegar no valor total exato, principalmente quando a balança está arredondando e o ecf truncando e utilizando 2 casas decimais, nestes casos optamos em calcular o valor total com 1 centavo a menos.

Nem pensar em alterar o preço do produto ... com certeza isto trará problemas com clientes.

Gabriel Fernandes
gabriel@addvancer.com
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2008 Invision Power Services, Inc.