Divisão entre doubles
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?
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
Curtidas 0
Respostas

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?
qual a versão do MSQL?
GOSTEI 0

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.
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
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
09/07/2009
No caso eu preciso de mais de 15 casas decimais.
GOSTEI 0

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
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
09/07/2009
desculpe... isso funciona no Firebird.
o indicado seria mesmo decimal ou numeric.
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
09/07/2009
Olá Pessoal.
Muitíssimo obrigado a todos.
Att;
Greik.
Muitíssimo obrigado a todos.
Att;
Greik.
GOSTEI 0