Histórico da Página
...
Portuguese | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ArredondamentoAbrangência
Quando utilizado o tipo numérico do AdvPLNo Protheus, pode haver diferença de arredondamento em algumas operações numéricasaritméticas. Isso ocorre devido a diferenças no armazenamento de variáveis numéricas nos diversos processadores. Diferença esta, inclusive, presente no Advplao armazenamento numérico do AdvPL ser baseado em ponto flutuante usado pelo Protheus. Estas diferenças inclusive, estão presentes no AdvPL, mesmo antes do surgimento do Protheus. A representação de um número em ponto flutuante na memória está sujeita a aproximação de valores. Mesmo um valor inteiro ou com apenas dois dígitos decimais, pode ser representada internamente por um número fracionário aproximado. Para evitar esses problemas de arredondamento, utilize a função 'Round', principalmente antes de realizar uma comparação, e antes de utilizar a função 'Int'. Desse modo, assegura-se que o resultado será correto independentemente do processador / plataforma. Exemplos: 1. If (Valor/30) = 50 // pode ser falso ou inválido If Round(Valor/30, 0) = 50 // correto 2. M->EE8_QTDEM1:= Int (M->EE8_SLDINI/M->EE8_QE) // pode ser falso ou inválido M->EE8_QTDEM1:= Int (Round(M->EE8_SLDINI/M->EE8_QE, 10)) // correto Isto significa que, um número resultante de uma operação aritmética entre dois números pode gerar um valor aproximado em memória que é diferente da representação deste terceiro número. Estas diferenças normalmente são perceptíveis nas operações de comparação numérica. Para garantir o comportamento correto nas comparações, devemos utilizar uma das funções de ajuste de precisão decimal ( Round() e/ou NoRound() ), onde informamos o número e a quantidade de casas decimais de ajuste para este número. Enquanto a função Round() arredonda o número caso a próxima casa decimal posterior a informada seja igual ou maior que 5, a função NoRound() "corta" o número sem arredondar. Por exemplo, Round(3.1415,3) = 3.142 e NoRound(3.1415,3) = 3.141 Exemplos: Ao invés de ...... If (nValor/30) >= 0.01 Explicação: |