none
Redondear decimales en SQL Server 2000

    Pregunta

  • Hola a todos.

    Tengo un procedimiento en SQL Server 2000 donde no consigo redondear decimales para obtener el mismo resultado que obtengo en mi aplicación y también en Excel.

    Un ejemplo:

    DECLARE @Inicio decimal(18,2)
    DECLARE @Final decimal(18,2)
    DECLARE @Diferencia decimal(18,2)
    
    SET @Inicio = 3.41
    SET @Final = 3.0
    
    SET @Diferencia = (((@Inicio - @Final) / @Inicio) * 100.0)
    PRINT @Diferencia
    SET @Diferencia = ROUND( (((@Inicio - @Final) / @Inicio) * 100.0), 2)
    PRINT @Diferencia

    Esto ofrece un resultado de 12.02, cuando en mi aplicación y en Excel, redondeado a dos decimales, ofrece el resultado 11,90, que es el correcto.

    ¿Alguien sabe donde me estoy equivocando?

    Gracias por anticipado.
    Tomás. 


    Tomas
    domingo, 10 de mayo de 2009 8:17

Respuestas

  • Hola.

    Bien, eso ya es otra cosa. Si no quieres que se redondee hasta el final, de entrada has de definir las variables @Inicio y @Final con un tipo de datos de más decimales, por ejemplo, decimal(18,8). Si de entrada @Inicio tiene sólo 2 decimales es imposible que pueda operar con más de dos.

    Alberto López Grande.
    lunes, 11 de mayo de 2009 9:07

Todas las respuestas

  • Hola.

    Esa cuenta da como resultado 12.02, que es el resultado que obtienes con el script. ¿Qué fórmula aplicas en la aplicación y en el Excel?

    Alberto López Grande.
    domingo, 10 de mayo de 2009 10:39
  • Ahora que leo tu respuesta, me ha dado que pensar y he verificado como se hace en Excel.
    He podido comprobar que el problema me viene que, tanto en Excel como en mi aplicación, no redondeo los decimales hasta el final de la fórmula.
    Es decir, las variables @Inicio y @Final, no tienen limitación en los decimales y por tanto calculan en base a 8 decimales sin redondeo, sin embargo @Diferencia lo redondeo a 2 decimales.

    Por ejemplo, si en una hoja Excel aplicamos lo siguiente:

    (((3.41 - 3) / 3.41) * 100)  - Da como resultado 12.02.

    Sin embargo:

    (((3.40517241 - 3) / 3.40517241) * 100)  - Da como resultado 11.90.

    Como se puede observar, a mi entender, el problema lo tengo en que SQL Server, siempre trabaja con dos decimales y yo necesito que trabaje con todos los decimales, menos al final, cuando calcula @Diferencia que debe redondear a 2 decimales.

    Ajustándose más a la realidad, la variable @Inicio quedaría del siguiente modo:

    DECLARE @Inicio decimal(18,2)
    DECLARE @Final decimal(18,2)
    DECLARE @Diferencia decimal(18,2)
    
    SET @Inicio = 3.40517241
    SET @Final = 3.0
    
    SET @Diferencia = (((@Inicio - @Final) / @Inicio) * 100.0)
    PRINT @Diferencia
    SET @Diferencia = ROUND( (((@Inicio - @Final) / @Inicio) * 100.0), 2)
    PRINT @Diferencia
    Gracias


    Tomas
    lunes, 11 de mayo de 2009 9:02
  • Hola.

    Bien, eso ya es otra cosa. Si no quieres que se redondee hasta el final, de entrada has de definir las variables @Inicio y @Final con un tipo de datos de más decimales, por ejemplo, decimal(18,8). Si de entrada @Inicio tiene sólo 2 decimales es imposible que pueda operar con más de dos.

    Alberto López Grande.
    lunes, 11 de mayo de 2009 9:07
  • Gracias, hay días en que uno parece dormido.
    Hacemos las cosas de forma tan automática que uno no se percata de los detalles mas evidentes.
    Tomas
    lunes, 11 de mayo de 2009 9:19