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

Carlos H. Cantu listas em warmboot.com.br
Sábado Novembro 6 06:45:00 -03 2021


O cast que ele fez é para numeric, portanto, o resultado não é ponto
flutuante e sim ponto fixo. Não há perda de precisão na conversão.

[]s
Carlos H. Cantu
eBook Guia de Migração para o FB 4 - www.firebase.com.br/guiafb4.php
www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br

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

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

GSvl> Em sex., 5 de nov. de 2021 às 21:19, GutembergAdv via lista <
GSvl> 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
>>
>>
GSvl> ______________________________________________
GSvl> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
GSvl> Para saber como gerenciar/excluir seu cadastro na lista, use:
GSvl> http://www.firebase.com.br/fb/artigo.php?id=1107
GSvl> Para consultar mensagens antigas:
GSvl> http://www.firebase.com.br/pesquisa_lista.html




Mais detalhes sobre a lista de discussão lista