none
T-Sql 2000 - Erro no ROUND RRS feed

  • Pergunta

  • Olá a todos. Estou com um problema que tem sido um verdadeiro carma para mim.

     

    Existe uma regra de arredondamento que não está sendo respeitada pelo Sql, e está causando erros no meu programa:

     

    SELECT ROUND(0.035, 2)

    A instrução acima deve retornar 0.04, correto.

     

    SELECT ROUND(0.045, 2)

    A instrução acima também deveria retornar 0.04, porém, se vc rodá-la, ela retornará 0.05 - ERRADO.

     

    Eu preciso de saber se existe algum service pack ou coisa do tipo que corriga esse bug do T-Sql.

     

    Obrigado.

     

    Jônatas

     

    - - - -

    Para efeito de consulta:

    Tabela 1: Em conformidade com a Resolução nº 886/66 da Fundação IBGE, o arredondamento é efetuado da seguinte maneira

    Condições

    Procedimentos

    Exemplos

    < 5

    O último algarismo a permanecer fica inalterado.

    53,24 passa a 53,2

    > 5

    Aumenta-se de uma unidade o algarismo a permanecer.

    42,87 passa a 42,9

    25,08 passa a 25,1

    53,99 passa a 54,0

     

    (i) Se ao 5 seguir em qualquer casa um algarismo diferente de zero, aumenta-se uma unidade no algarismo a permanecer.

    2,352 passa a 2,4

    25,6501 passa a 25,7

    76,250002 passa a 76,3

    = 5

     

     

     

     

    (ii) Se o 5 for o último algarismo ou se ao 5 só seguirem zeros, o último algarismo a ser conservado só será aumentado de uma unidade se for ímpar.

    24,75 passa a 24,8

    24,65 passa a 24,6

    24,7500 passa a 24,8

    24,6500 passa a 24,6

    Fonte: Adaptado de CRESPO, 1991 (http://www.banasmetrologia.com.br/imprime.asp?codigo=1360)

    quinta-feira, 29 de novembro de 2007 13:18

Respostas

  • Tudo bem, mas se eu utilizar o FLOOR ou o CEILING, eles me retornariam valores inteiros, correto? Eu preciso de valores com 2 casas decimais...

     

    Talves se eu criar uma SP para arredondar do jeito que eu preciso resolva, não é?

     

     

    []s

     

    Jônatas

    quinta-feira, 29 de novembro de 2007 16:02
  • Jônatas,

     

    Realmente criando uma stored procedure poderá ajudar!!!

     

    quinta-feira, 29 de novembro de 2007 16:04

Todas as Respostas

  • Jônatas,

     

    Qual é a versão do seu SQL Server?

     

    Já tentou utilizar outras funções como Floor ou Ceiling?

    quinta-feira, 29 de novembro de 2007 13:33
  •  

    Olá Jônatas!!

     

    Pelo que tá escrito, essa é uma regra definida pela fundação IBGE, e não tem relação alguma com a ISO que internacional! Resumindo, arredondamentos diferentes para pares e ímpares? Isso não pode existir.

     

    Ah... e isso não é bug. É conformidade com padrões internacionais.

     

    Sendo assim, vejo que a melhor alternativa é você desenvolver uma função que faça o arredondamento da forma como você deseja.

     

    Se precisar de uma ajuda, retorne aqui.

     

     

    Abraço

    quinta-feira, 29 de novembro de 2007 13:58
  • Junior,

     

    Aho que isso responde à sua pergunta. Senão, me fale onde eu posso olhar...

     

    SELECT @@VERSION

    Microsoft SQL Server  2000 - 8.00.2039 (Intel X86)   May  3 2005 23:18:38   Copyright (c) 1988-2003 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

     

     

    Quanto ao CEILING e FLOOR, não entendi qual é a relação com o que eu preciso.

     

    []s

     

    Jônatas

    quinta-feira, 29 de novembro de 2007 15:46
  • Jônatas,

     

    Perguntei sobre a versão somente por questões de informação.

     

    Sobre este tipo de situação que você esta passando não é um erro, mas sim uma forma de trabalho que o SQL Server utiliza.

     

    Em relação as funções Ceiling e Floor, são funções que também trabalham com arredondamento de valores.

     

    quinta-feira, 29 de novembro de 2007 15:55
  • Alexandre,

     

    Sua teoria é interessante, porém, se assim fosse, o VB6, que também é da Microsoft, não deveria fazer igual? Porém ele segue a regra que eu disse...

     

    []s

     

     

    Jônatas

     

    quinta-feira, 29 de novembro de 2007 15:57
  • Jônatas,

     

    Não por que o VB6 é uma ferramenta para desenvolvimento de software, possuí outras regras e definições, já o SQL Server é uma ferramenta para gerenciamento de banco de dados, são ferramentas diferente para funcionalidades diferentes.

    quinta-feira, 29 de novembro de 2007 15:59
  • Tudo bem, mas se eu utilizar o FLOOR ou o CEILING, eles me retornariam valores inteiros, correto? Eu preciso de valores com 2 casas decimais...

     

    Talves se eu criar uma SP para arredondar do jeito que eu preciso resolva, não é?

     

     

    []s

     

    Jônatas

    quinta-feira, 29 de novembro de 2007 16:02
  • Jônatas,

     

    Realmente criando uma stored procedure poderá ajudar!!!

     

    quinta-feira, 29 de novembro de 2007 16:04
  • Entendi...

     

    O problema é que eu não posso deixar de usar o ROUND do SQl nem o do VB... e eles teriam de estar um de acordo com o outro.

     

    Não sei o que fazer...

     

     

    []s

     

    Jônatas

     

    quinta-feira, 29 de novembro de 2007 16:05