Divisão entre doubles

SQL Server

09/07/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?


Greik

Greik

Curtidas 0

Respostas

Jair Bg

Jair Bg

09/07/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?


GOSTEI 0
Greik

Greik

09/07/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.


GOSTEI 0
Jair Bg

Jair Bg

09/07/2009

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


GOSTEI 0
Greik

Greik

09/07/2009

No caso eu preciso de mais de 15 casas decimais.


GOSTEI 0
Jair Bg

Jair Bg

09/07/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.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

09/07/2009

pra você entender, tente assim:
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;



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

09/07/2009

desculpe... isso funciona no Firebird.
o indicado seria mesmo decimal ou numeric.
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;



GOSTEI 0
Greik

Greik

09/07/2009

Olá Pessoal.

Muitíssimo obrigado a todos.

Att;
Greik.


GOSTEI 0
POSTAR