Array
(
)

Divisão entre doubles

Greik
   - 09 jul 2009

Olá, bom dia.

Srs., uma colega está com um problema: Ela criou uma procedure que faz a divisão de 2 variáveis do tipo double precision. Quando ela executa o comando, o resultado está truncando o valor. Mas não há nenhum round nem trunc para isso.

Alguém sabe se é alguma configuração do SQL Server, ou se há algo a fazer para não truncar essa divisão?

Jair Bg
   - 09 jul 2009

Boa Tarde, tem como passar o exemplo desta procedure? e se possível alguns dados de referencia para o exemplo...
qual a versão do MSQL?

Greik
   - 10 jul 2009

Caro Jair, boa tarde.

Segue abaixo um exemplo da procedure que não retorna todas as informações:

ALTER PROCEDURE TESTE

AS
DECLARE @V_VRATUAL DOUBLE PRECISION;
DECLARE @V_TESTE DOUBLE PRECISION;
DECLARE @V_1 DOUBLE PRECISION;
DECLARE @V_2 DOUBLE PRECISION;

BEGIN

SET @V_1=1000000
SET @V_2=5001
SET @V_VRATUAL = @V_1 / @V_2;
SET @V_TESTE = @V_VRATUAL;

PRINT(@V_TESTE);
END;

Esse cálculo deveria retornar: 199,96000799840031993601279744051

Como posso fazer?
Muito obrigado.

Jair Bg
   - 10 jul 2009

Boa Tarde voce poderá substituir o DOUBLE PRECISION por NUMERIC(25,9); no caso para nove casas decimais, quantas você precisa?

Greik
   - 10 jul 2009

No caso eu preciso de mais de 15 casas decimais.

Jair Bg
   - 10 jul 2009

Os tipos DECIMAL, NUMERIC e MONEY o agumento de precisão é 30 no máximo, os tipos de dado FLOAT, REAL e DOUBLE PRECISION são como tipos numéricos aproximados. não exatos de precisão variável. conforme suportado pelo processador, sistema operacional o arredondamento pode acontecer se a precisão do número for muito grande.

Emerson
   - 11 jul 2009

pra você entender, tente assim:
#Código

ALTER PROCEDURE TESTE

AS
DECLARE @V_VRATUAL DOUBLE PRECISION;
DECLARE @V_TESTE DOUBLE PRECISION;
DECLARE @V_1 DOUBLE PRECISION;
DECLARE @V_2 DOUBLE PRECISION;

BEGIN

       SET @V_1=1000000
       SET @V_2=5001.00000000000000000000
       SET @V_VRATUAL = @V_1 / @V_2;
       SET @V_TESTE = @V_VRATUAL;

       PRINT(@V_TESTE);
END;


Emerson
   - 11 jul 2009

desculpe... isso funciona no Firebird.
o indicado seria mesmo decimal ou numeric.#Código

ALTER  PROCEDURE TESTE

AS
DECLARE @V_VRATUAL decimal(30,20)
DECLARE @V_TESTE decimal(30,20);
DECLARE @V_1 DOUBLE PRECISION;
DECLARE @V_2 DOUBLE PRECISION;

BEGIN

       SET @V_1=1000000
       SET @V_2=5001
       SET @V_VRATUAL = @V_1 / @V_2;
       SET @V_TESTE = @V_VRATUAL;

       PRINT(@V_TESTE);
END;


Greik
   - 22 out 2009

Olá Pessoal.

Muitíssimo obrigado a todos.

Att;
Greik.