[firebase-br] Conversão cast com alteração de valor

Gladiston Santana gladiston em vidy.com.br
Sexta Novembro 5 22:50:03 -03 2021


Processadores só trabalham com inteiros e ao fazer calculo de numeros de
ponto flutuante usarão dois inteiros, um para cada lado do ponto decimal,
não existe uma soma  como a dos humanos, se você já teve aula C/C++ ou Java
sabe então que um 'i++' não é a mesma coisa que 'i=i+1' embora chegue ao
mesmo resultado. Segue uma norma IEEE que privilegia a performance dos
processadores então para resumo da conversa, os bits no final da conta
geram essas insignificâncias.
Sabendo disso, qualquer conversão implícita que é quando voce junta números
de tipos diferentes ou explícita com uso de cast/convert vão produzir esse
efeito. Os cálculos para serem precisos, precisam dum tipo específico para
isso, não vou dizer qual é, mas dá uma olhada nos tipos existentes no FB e
descobrirá qual (adianto que NUMERIC não é).
Você está usando um cast então entra no que eu falei e portanto não tem
como aferir se a conversão interna irá respeitar o tipo do valor final
desejado.
Para resolver o problema já que você necessita de precisão é usar apenas
variáveis que guardem a precisão exata evitando casting implicito e
explicito, mas nada te impede de fazer cast para string no final só para
espiar o resultado final, vou usar a sua própria fórmula e veja como ela
dará certo sem o cast string->numero:
with q1 as (
  select 1485.45 as VlrOriginal from rdb$database
)
select
  q1.VlrOriginal,
  cast(q1.VlrOriginal as varchar(30))
from q1

A conclusão é que você não pode confiar num cast implícito ou explícito ou
sua precisão vai para o buraco.

Em sex., 5 de nov. de 2021 às 21:19, GutembergAdv via lista <
lista em firebase.com.br> escreveu:

> /* Alguém sabe me dizer porque este cast gera dígitos significativos no
> final do número? */
> /* Neste caso foi o valor 3. Também preciso saber como evitar isso. É
> necessário ter exatidão no valor */
> /* Firebird 3 */
>
> select
>  '1485.45' VlrOriginal,
>  cast('1485.45' as numeric(18,13)) VlrConvertido
> from rdb$database
>
>


Mais detalhes sobre a lista de discussão lista