none
Conversão e arredondamento de valor money

    Question

  • Estou com um problema para ajustar o valor da minha tabela para o novo layout da empresa.
    O layout novo é 999999999.9999
    ou seja, tamanho 14 e com 4 casas decimais.

    Se eu uso o "as money" por exempo, um item de valo 0,675677
    vai ficar 0,67568 com 5 casas decimais.

    Se eu usar um "as money" junto com um "as char (14)" de 0,675677
    ele arredonda para 0,7.

    Existe alguma maneira de eu converter ou arredondando, mas mantendo o tamanho máximo de 14
    e com 4 casas decimais, igual o layout da empresa?

    Obrigado, se alguém puder ajudar, agradeço muito.

    Saturday, February 05, 2011 11:05 PM

Answers

  • xDougz,

    Acredito que o melhor seria utilizar o Numeric, ao invês de money.

    Seria um Numeric(14,4)!!!!


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    • Marked as answer by xDougz Thursday, February 10, 2011 1:37 PM
    Sunday, February 06, 2011 12:47 AM
  • Completando a resposta do Junior...

    Como vc deseja 14 de escala e 4 de precisão, deverás declarar o datatype do atributo como numeric mesmo, porém deverá declará-lo da seguinte maneira:

     

    NUM2 NUMERIC(18,4)

     

    Com isso, o campo deverá permitir a inclusão de 18 numeros, sendo 4 deles casas decimais à direita da vírgula.

     

    Abs,

    Marco Rocha. 


    Marco Rocha
    • Marked as answer by xDougz Thursday, February 10, 2011 1:37 PM
    Tuesday, February 08, 2011 12:00 AM
  • xDougz,

         Bom dia! Eu não utilizaria o DECIMAL não... E o motivo é simples, é por conta do DECIMAL(18,4) utilizar 1 byte a mais do que o MONEY e armazenar menos valores no intervalo (1 dígito a menos...). Pode parecer que isso não tem influência, mas, imagine uma tabela de 30.000.000 de registros... Esse único byte em um único campo seria responsável por quase 30Mb a mais no espaço de armazenamento da sua base de dados...

         O que eu faria é utilizar a função ROUND que faz exatamente o que você precisa. Veja o exemplo abaixo:

    DECLARE

     

    @valor MONEY, @decValor DECIMAL(18,4), @ValorTrunc MONEY, @decValorTrunc DECIMAL(18,4)

    SET

     

    @valor = 0.675677

    SET

     

    @decValor = 0.675677

    SET

     

    @ValorTrunc = ROUND(0.675677, 4, 1)

    SET

     

    @decValorTrunc = ROUND(0.675677, 4, 1)

    SELECT

     

    @valor, @decvalor, @ValorTrunc, @decValorTrunc

    -- Resultado

    --------------------- --------------------------------------- --------------------- ---------------------------------------

    0,6757                          0.6757                                     0,6756                              0.6756

    Espero ter ajudado!

     


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008
    • Marked as answer by xDougz Thursday, February 10, 2011 1:37 PM
    Thursday, February 10, 2011 10:31 AM
    Moderator

All replies

  • xDougz,

    Acredito que o melhor seria utilizar o Numeric, ao invês de money.

    Seria um Numeric(14,4)!!!!


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    • Marked as answer by xDougz Thursday, February 10, 2011 1:37 PM
    Sunday, February 06, 2011 12:47 AM
  • Completando a resposta do Junior...

    Como vc deseja 14 de escala e 4 de precisão, deverás declarar o datatype do atributo como numeric mesmo, porém deverá declará-lo da seguinte maneira:

     

    NUM2 NUMERIC(18,4)

     

    Com isso, o campo deverá permitir a inclusão de 18 numeros, sendo 4 deles casas decimais à direita da vírgula.

     

    Abs,

    Marco Rocha. 


    Marco Rocha
    • Marked as answer by xDougz Thursday, February 10, 2011 1:37 PM
    Tuesday, February 08, 2011 12:00 AM
  • Certo, Obrigado pela ajuda Junior e Marcos isso ajudou resolveu meu problema com o layout.

    Agora eu estou com outro problema, eu queria retirar o arredondamento da ultima casa. Como no exemplo eu precisaria q o valor 0,675677 ficasse 0,6756 e não 0,6757

    Dá pra resolver isso?

    • Marked as answer by xDougz Thursday, February 10, 2011 1:37 PM
    • Unmarked as answer by xDougz Thursday, February 10, 2011 1:37 PM
    Thursday, February 10, 2011 12:24 AM
  • xDougz,

         Bom dia! Eu não utilizaria o DECIMAL não... E o motivo é simples, é por conta do DECIMAL(18,4) utilizar 1 byte a mais do que o MONEY e armazenar menos valores no intervalo (1 dígito a menos...). Pode parecer que isso não tem influência, mas, imagine uma tabela de 30.000.000 de registros... Esse único byte em um único campo seria responsável por quase 30Mb a mais no espaço de armazenamento da sua base de dados...

         O que eu faria é utilizar a função ROUND que faz exatamente o que você precisa. Veja o exemplo abaixo:

    DECLARE

     

    @valor MONEY, @decValor DECIMAL(18,4), @ValorTrunc MONEY, @decValorTrunc DECIMAL(18,4)

    SET

     

    @valor = 0.675677

    SET

     

    @decValor = 0.675677

    SET

     

    @ValorTrunc = ROUND(0.675677, 4, 1)

    SET

     

    @decValorTrunc = ROUND(0.675677, 4, 1)

    SELECT

     

    @valor, @decvalor, @ValorTrunc, @decValorTrunc

    -- Resultado

    --------------------- --------------------------------------- --------------------- ---------------------------------------

    0,6757                          0.6757                                     0,6756                              0.6756

    Espero ter ajudado!

     


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008
    • Marked as answer by xDougz Thursday, February 10, 2011 1:37 PM
    Thursday, February 10, 2011 10:31 AM
    Moderator
  • Obrigado a Vocês que me ajudaram, eu "adaptei" tudo que vcs me 
    explicaram, e consegui resolver meu problema.

    eu utilizei o seguinte código para resolver 
    Cast(Cast(Round(Cast(Item.Valor as Numeric (18,6)),4,1)as Numeric (18,4)) as CHAR (14))
    

    Que me trouxe o resultado 

    --------------

    0.6756 

    que era exatamente o que eu precisava.

    Thursday, February 10, 2011 1:36 PM