[firebase-br] Arredondamento no Firebird!

Francisco Thiago jeandeadlucky em yahoo.com.br
Ter Ago 30 13:45:56 -03 2005


Valew Benjamim!

Olha, de certa forma resolvemos o problema...

Antes era:

numeric(12,2) =  (numeric(12,2) * ((numeric(7,4) / 30) * integer)) / 100;

E mudamos para

numeric(12,2) =  (numeric(12,2) * ((numeric(7,4) / 30.0) * integer)) / 100;

Ou seja, a divisão que estava sendo feita entre um Numeric(7,4) e um 
Integer, passou a ser feita por "Float's".

Agora, porque a diferença?


Francisco Thiago de Almeida
Enter & Plug Informática
Divisão: Desenvolvimento e Banco de dados
Franca / SP
msn: thiago em enterplug.com.br


----- Original Message ----- 
From: "benjamim" <benjamimo em agesul.ms.gov.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Tuesday, August 30, 2005 12:38 PM
Subject: Re: [firebase-br] Arredondamento no Firebird!


> Olá Francisco,
> Eu peguei isto nas respostas encontradas neste forum, só não tenho os 
> nomes dos colegas que responderam, para dar o direito. Espero que resolva.
> Benjamim
>
> Cast( ( 26,58*1.05678 *100 ) as Integer ) /100
>
> Eu, para truncar, subtraio 5x10e-(N-1) e utilizo o cast, que arredonda.
>
>    Simplificando:
>        Se quero duas casas decimais, arrendo (valor-0.005).
>        Uma casa, (valor - 0.05).
>        Nenhuma casa, (valor - 0.5)
>
> Exemplos:
>
> Select
>   cast(1.9999999999 - 0.005 as numeric(15,2)) as DUAS,
>   cast(1.9999999999 - 0.05 as numeric(15,1))as UMA,
>   cast(1.9999999999 - 0.5 as integer) as NENHUMA
> from rdb$database
>
> DUAS |  UMA   | NENHUMA
> ----------|------------|----------------
>  1.99  |    1.9   |     1
>
>
> ----- Original Message ----- 
> From: "Francisco Thiago" <jeandeadlucky em yahoo.com.br>
> To: "Antonio Carlos" <a.lima.silva em terra.com.br>; "FireBase" 
> <lista em firebase.com.br>
> Sent: Tuesday, August 30, 2005 9:34 AM
> Subject: Re: [firebase-br] Arredondamento no Firebird!
>
>
>> Os testes estão sendo feitos no IBExpert
>>
>>
>> ----- Original Message ----- 
>> From: "Antonio Carlos" <a.lima.silva em terra.com.br>
>> To: "FireBase" <lista em firebase.com.br>
>> Sent: Tuesday, August 30, 2005 9:04 AM
>> Subject: Re: [firebase-br] Arredondamento no Firebird!
>>
>>
>> Caro Francisco :
>>
>> Voce esta usando qual componente de acesso seria DBExpress e o 
>> SQLStoreProc
>> ?
>>
>> ----- Original Message ----- 
>> From: "Francisco Thiago" <jeandeadlucky em yahoo.com.br>
>> To: "FireBase" <lista em firebase.com.br>
>> Sent: Monday, August 29, 2005 4:50 PM
>> Subject: [firebase-br] Arredondamento no Firebird!
>>
>>
>>> Pessoal!!!
>>>
>>> Estamos com um probleminha aqui.
>>>
>>> Meu amigo, Ademar, está escrevendo uma SP para cálculos financeiros. No 
>>> entantdo, a aproximação feita pelo firebird não está... digamos... muito 
>>> correto... E gostaria de saber como fazer para sanar este problema...
>>> Imagino que tenha alguma coisa relativa a declaração no campo na SP...
>>>
>>> Estamos retornando valores Numeric(12,2), Numeric(7,4)
>>>
>>>
>>> O código da SP segue no final do e-mail....
>>>
>>> Obrigado a todos que puderem nos ajudar
>>>
>>>
>>>
>>> []'s
>>>
>>> Francisco Thiago de Almeida
>>> Enter & Plug Informática
>>> Divisão: Desenvolvimento e Banco de dados
>>> Franca / SP
>>> msn: thiago em enterplug.com.br
>>>
>>>
>>> CREATE PROCEDURE RESUMOOPERACAO (
>>>    P_OPER_CODIGO INTEGER)
>>> RETURNS (
>>>    OPER_TOTAL NUMERIC(12,2),
>>>    OPER_TOTFATOR NUMERIC(12,2),
>>>    OPER_TOTADVALOREN NUMERIC(12,2),
>>>    OPER_TOTIOF NUMERIC(12,2),
>>>    OPER_TOTCPMF NUMERIC(12,2),
>>>    OPER_TOTCHEQUE NUMERIC(12,2),
>>>    OPER_SUBTOTAL NUMERIC(12,2),
>>>    OPER_TOTLIQ NUMERIC(12,2)
>>>    )
>>> AS
>>> DECLARE VARIABLE V_OPER_CPMF NUMERIC(7,4);
>>> DECLARE VARIABLE V_OPER_IOF NUMERIC(7,4);
>>> DECLARE VARIABLE V_OPER_FATOR_CHEQUE_ACIMA NUMERIC(7,4);
>>> DECLARE VARIABLE V_OPER_CHEQUE_ACIMA NUMERIC(12,2);
>>> DECLARE VARIABLE V_OPIT_DIAS INTEGER;
>>> DECLARE VARIABLE V_OPIT_VALOR NUMERIC(12,2);
>>> DECLARE VARIABLE V_OPER_PERCFATORCOMPRA NUMERIC(7,4);
>>> DECLARE VARIABLE V_OPIT_ADVALOREN NUMERIC(12,2);
>>> DECLARE VARIABLE V_OPIT_CPMF NUMERIC(12,2);
>>> DECLARE VARIABLE V_OPIT_IOFTOT NUMERIC(7,4);
>>> DECLARE VARIABLE V_OPIT_VALORIOF NUMERIC(12,2);
>>> DECLARE VARIABLE V_OPIT_FATOR NUMERIC(12,2);
>>> begin
>>>
>>>  /*ZERO OS RETORNOS*/
>>>
>>>  OPER_SUBTOTAL = 0;
>>>  OPER_TOTAL = 0;
>>>  OPER_TOTFATOR = 0;
>>>  OPER_TOTADVALOREN = 0;
>>>  OPER_TOTIOF = 0;
>>>  OPER_TOTCPMF = 0;
>>>  select
>>>    OPERACAO.OPER_CPMF,
>>>    OPERACAO.OPER_IOF,
>>>    OPERACAO.OPER_FATOR_CHEQUE_ACIMA,
>>>    OPERACAO.OPER_CHEQUE_ACIMA,
>>>    OPERACAO.OPER_PERCFATORCOMPRA
>>>  from
>>>    OPERACAO
>>>  where
>>>    OPERACAO.OPER_CODIGO = :P_OPER_CODIGO
>>>  into
>>>    :V_OPER_CPMF,
>>>    :V_OPER_IOF,
>>>    :V_OPER_FATOR_CHEQUE_ACIMA,
>>>    :V_OPER_CHEQUE_ACIMA,
>>>    :V_OPER_PERCFATORCOMPRA;
>>>
>>>    if (V_OPER_CPMF IS NULL) then V_OPER_CPMF = 0;
>>>    if (V_OPER_IOF IS NULL) then V_OPER_IOF = 0;
>>>    if (V_OPER_FATOR_CHEQUE_ACIMA IS NULL) then V_OPER_FATOR_CHEQUE_ACIMA 
>>> = 0;
>>>    if (V_OPER_CHEQUE_ACIMA IS NULL) then V_OPER_CHEQUE_ACIMA = 0;
>>>    if (V_OPER_PERCFATORCOMPRA IS NULL) then V_OPER_PERCFATORCOMPRA = 0;
>>>
>>>  for select
>>>    OPERACAO_ITEM.OPIT_DIAS,
>>>    OPERACAO_ITEM.OPIT_VALOR,
>>>    OPERACAO_ITEM.OPIT_ADVALOREN
>>>  from
>>>    OPERACAO_ITEM
>>>    join OPERACAO on OPERACAO.OPER_CODIGO = OPERACAO_ITEM.OPER_CODIGO
>>>  where
>>>    OPERACAO_ITEM.OPER_CODIGO = :P_OPER_CODIGO
>>>  into
>>>    :V_OPIT_DIAS,
>>>    :V_OPIT_VALOR,
>>>    :V_OPIT_ADVALOREN
>>>  do
>>>    begin
>>>      if (V_OPIT_DIAS IS NULL) then V_OPIT_DIAS = 0;
>>>      if (V_OPIT_VALOR IS NULL) then V_OPIT_VALOR = 0;
>>>      if (V_OPIT_ADVALOREN IS NULL) then V_OPIT_ADVALOREN = 0;
>>>
>>>      /*SOMO O VALOR DAS DUPLICATAS*/
>>>      OPER_TOTAL = OPER_TOTAL + V_OPIT_VALOR;
>>>
>>>      /*ACHO O VALOR DO FATOR DE COMPRA*/
>>>
>>>      V_OPIT_FATOR = ((V_OPIT_VALOR * ((V_OPER_PERCFATORCOMPRA/30)
>>>                       * V_OPIT_DIAS))/100);
>>>
>>>      if (V_OPIT_FATOR IS NULL) then
>>>        V_OPIT_FATOR = 0;
>>>
>>>      OPER_TOTFATOR = OPER_TOTFATOR + V_OPIT_FATOR;
>>>
>>>      /*ACHO O VALOR DO CPMF*/
>>>
>>>      V_OPIT_CPMF = ((V_OPIT_VALOR - V_OPIT_FATOR - V_OPIT_ADVALOREN) *
>>>                     (V_OPER_CPMF)/100);
>>>
>>>      IF (V_OPIT_CPMF IS NULL) THEN
>>>        V_OPIT_CPMF = 0;
>>>
>>>      OPER_TOTCPMF = OPER_TOTCPMF + V_OPIT_CPMF;
>>>
>>>      /*ACHO O VALOR IOF*/
>>>      V_OPIT_IOFTOT = V_OPER_IOF * V_OPIT_DIAS;
>>>
>>>      V_OPIT_VALORIOF = ((V_OPIT_VALOR - V_OPIT_FATOR - V_OPIT_ADVALOREN) 
>>> *
>>>                         (V_OPIT_IOFTOT)/100);
>>>
>>>      if (V_OPIT_VALORIOF IS NULL) then
>>>        V_OPIT_VALORIOF = 0;
>>>
>>>      OPER_TOTIOF = OPER_TOTIOF + V_OPIT_VALORIOF;
>>>
>>>      /*ACHO O TOTAL ADVALOREN*/
>>>      OPER_TOTADVALOREN = OPER_TOTADVALOREN + V_OPIT_ADVALOREN;
>>>
>>>      V_OPIT_VALOR = 0;  V_OPIT_FATOR = 0;    V_OPIT_CPMF = 0;
>>>      V_OPIT_IOFTOT = 0; V_OPIT_VALORIOF = 0; V_OPIT_ADVALOREN = 0;
>>>    end
>>>
>>>    OPER_SUBTOTAL = OPER_TOTAL - OPER_TOTFATOR - OPER_TOTADVALOREN - 
>>> OPER_TOTIOF -
>>>                    OPER_TOTCPMF;
>>>    if (OPER_SUBTOTAL >= V_OPER_CHEQUE_ACIMA) then
>>>    begin
>>>      OPER_TOTCHEQUE = (OPER_SUBTOTAL *
>>>                         V_OPER_FATOR_CHEQUE_ACIMA)/100;
>>>      OPER_TOTLIQ    =  OPER_SUBTOTAL - OPER_TOTCHEQUE;
>>>    end
>>>    else
>>>    begin
>>>      OPER_TOTCHEQUE = 0;
>>>      OPER_TOTLIQ    = OPER_SUBTOTAL;
>>>    end
>>>  suspend;
>>> end
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________________ Yahoo! Acesso 
>>> Grátis - Internet rápida e grátis. Instale o discador agora! 
>>> http://br.acesso.yahoo.com/
>>>
>>>
>>> ______________________________________________
>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>>> Para editar sua configuração na lista, use o endereço 
>>> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>
>>>
>>
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>> Para editar sua configuração na lista, use o endereço 
>> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>>
>>
>>
>>
>>
>> _______________________________________________________ Yahoo! Acesso 
>> Grátis - Internet rápida e grátis. Instale o discador agora! 
>> http://br.acesso.yahoo.com/
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>> Para editar sua configuração na lista, use o endereço 
>> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço 
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> 



	
	
		
_______________________________________________________ 
Yahoo! Acesso Grátis - Internet rápida e grátis. 
Instale o discador agora! http://br.acesso.yahoo.com/





Mais detalhes sobre a lista de discussão lista