SQL Server отменяет округление результата умножения

#sql-server #rounding

#sql-server #округление

Вопрос:

Я был бы признателен, если бы вы могли ознакомиться со следующим кодом SQL и рассказать мне, как заставить SQL server НЕ округлять результат мультипликации 4-го столбца выбора:

     select  --tmp1.[Session.Call_TYPE_Assigned] CR,
            tmp2.cnt_match / cast(tmp1.cnt as float)   as precision,
            tmp1.cnt as cnt,
            tmp2.cnt_match / cast(tmp1.cnt as float) * tmp1.cnt


    from 
    ( select [Session.Call_TYPE_Assigned],COUNT(*) as cnt from 
    dbo.CEA_CR CEA_CR
    where CEA_CR.cycle = '4' and CEA_CR.version = '1'
    group by [Session.Call_TYPE_Assigned] )  as tmp1
    ,
    (select [Session.Call_TYPE_Assigned],COUNT(*) as cnt_match from 
    dbo.CEA_CR CEA_CR
    where  [Session.Did_Call_Type_happen_on_this_call]= 'Yes' and CEA_CR.cycle = '4' and CEA_CR.version = '1'
    group by [Session.Call_TYPE_Assigned])  tmp2
    where tmp1.[Session.Call_TYPE_Assigned] = tmp2.[Session.Call_TYPE_Assigned] 
  

результирующий набор выглядит следующим образом

0.666666666666667
3
2

хотя 2 не является произведением 0,6 * 3, спасибо

Ответ №1:

Я бы подумал, что либо:

 convert(float,tmp2.cnt_match / cast(tmp1.cnt as float) * tmp1.cnt)
  

в качестве последней строки выбора или

 convert(float,[precision] * tmp1.cnt)
  

в качестве последней строки выбора может сработать.

Комментарии:

1. Я немного удивлен, потому что, если вы запустите SELECT convert (FLOAT, 0.6667 * 2) на своем компьютере, вы должны получить 2.0001!

2. Эй, я только что запустил 0.6666666666666667 в приведенном выше выборе, и он также дает 2, возможно, это достаточно точно для SQL Server.

3. Может быть, это просто float! ВЫБЕРИТЕ преобразовать(десятичное число (16,15),0,666666666666667 * 3).