Boa tarde!
Precisei analisar a situação de um cliente, e mesmo após resolver o problema dele, me surgiu uma duvida quanto à geração do XML do SAT, que eu gostaria de compartilhar.
A quantidade de casas decimais para valor unitário é de 2, ou 3 para combustiveis, e o arredondamento para o SAT é baseado na NBR 5891-1977 da ABNT, onde eu já até tinha uma função para isso, mas vi que o ACBr também possui a sua (RoundABNT) e ambas chegam sempre no mesmo resultado. A situação do meu cliente era simples, ele tinha um produto com o seguinte preço: R$ 5,985. Se você arredondar para duas casas decimais seguindo a norma, o resultado é: R$ 5,98. Não vou entrar no mérito do pq o resultado ser esse, mesmo pq a função do ACBr retorna esse valor também, que é o correto. Quando meu sistema mandava esse valor com 3 casas para o componente o SAT dava erro, pq no XML chegava o valor de R$ 5,99 e os pagamentos informados consideravam R$ 5,98. Resolvei esse problema arredondando para 2 casas decimais antes de jogar no componente para a geração do XML. Porém, fui verificar a rotina de geração do XML e na unit pcnGerador tem a seguinte chamada:
ConteudoProcessado := FloatToString(valorDbl, FOpcoes.DecimalChar, FloatMask(NumeroDecimais, False));
Essa função FloatToString utiliza internamente o FormatFloat, e por isso quando o valor R$ 5,985 chega nela, o resultado é R$ 5,99.
Entendo que o meu software deveria já mandar pro componente as 2 casas decimais, e como está fazendo agora, fica tudo certo. Mas se a função tem o tratamento para acertar a quantidade de casas decimais de acordo com a especificação, ela não deveria seguir tbm a norma, e arredondar para R$ 5,98?
Reafirmo que já resolvi isso no meu software, mas acho legal considerarem esse ponto.
Agradeço desde já.