none
NUmeric presición RRS feed

  • Pregunta

  • Tengo el siguiente escenario:

    si ejecuto esto en SQL Server 2016:

        select 55.17500000 * -113.81250000

    me da como resultado: -6279.6046875000000000

    Pero si agrego esos valores a una variable, algo asi:

    DECLARE @temp1 numeric(28,10) =55.175000000000,               @temp2 numeric(28,10) = -113.8125000000000

    y lo ejecuto así:

    select convert(numeric(28,10), @temp1 * @temp2)

    O así:

      select (@temp1 * @temp2)

    el resultado que obtengo en ambos casos es: -6279.6046880000

    si notan tengo un redondeo que no deseo y eso a pesar de que aún no ha superado los 10 decimales, como para deducir que se aplica el redondeo por parte de SQL .

    Pregunta:

    Saben cómo puedo forzar para que esa operación con variables me dé el mismo resultado al primero?

    Saben cómo puedo forzar para que una operación llevada a cabo en SQL Server, aplique el tipo de redondeo que yo le defina?


    miércoles, 25 de octubre de 2017 5:54

Todas las respuestas

  • Hola, el problema está en la conversión implícita , en el primer caso la operación te la está realizando como float, 

    si pruebas un select CAST(@temp1 as float)* CAST(@temp2 as float)  o si lo necesitas sacar como numeric un  select CONVERT(numeric(28,10),( CAST(@temp1 as float)* CAST(@temp2 as float))) y verás que tus resultado son iguales..


    JM Claudio Dba/Consultor SQL/BI Pasiona - Spain

    miércoles, 25 de octubre de 2017 9:52
  • Me parece interesante, pero a nivel de precisión, en números más grandes, crees que no tendré implicaciones al respecto con el resultado final resultante?

    Cuál es tu opinión con respecto a float versus Numeric?

     Te pongo ell siguiente ejemplo:

     "Si existe alguna forma de evitarlo, seria genial"

    DECLARE @temp3 numeric(28,10) =99999999999999999.999999999
    select @temp3

    DECLARE @temp4 float =99999999999999999.999999999
    select @temp4

    select convert(numeric(28,10),  @temp4)

    O el siguiente ejemplo:

    DECLARE @temp3 numeric(26,8) =99999999999999.99999999
    select @temp3

    DECLARE @temp4 float =99999999999999.99199999
    select @temp4

    select convert(numeric(28,10),  @temp4)

    De ante mano, gracias por tu ayuda.


    miércoles, 25 de octubre de 2017 17:51