不能将除法转换为十进制

时间:2014-06-04 07:38:17

标签: sql sql-server

我有以下代码,它打印0.我需要正确的结果(3.571428571428571)。

此代码有什么问题?

  declare @result decimal;
  declare @a int; set @a = 56;
  declare @b int; set @b = 2;
  declare @p int; set @p = 100;
  set @result = CAST(((@b / @a)*100) as decimal);
  print @result

3 个答案:

答案 0 :(得分:3)

这称为整数除法。

  

“如果整数被除数除以整数除数,则为结果   是一个整数,截断结果的任何小数部分。“

/ (Divide) (Transact-SQL)

所以请改用小数。例如:

declare @result decimal(27,17)
declare @a decimal(25,15)
set @a = 56
declare @b decimal(25,15)
set @b = 2

set @result = (@b / @a) * 100
select @result

Demo

如果您需要将结果百分比四舍五入到小数点后两位,则可以使用decimal(5, 2)ROUND

declare @percent decimal(5,2)
declare @a decimal(25,15)
set @a = 56
declare @b decimal(25,15)
set @b = 2

set @percent = ROUND((@b / @a) * 100, 2)
select @percent 

Demo

答案 1 :(得分:0)

如果你真的需要cast,请使用:

declare @result decimal;
declare @a int; set @a = 56;
declare @b int; set @b = 2;
declare @p int; set @p = 100;
set @result = (cast(@b as decimal) / @a)*100;
print @result

它将变量@b强制转换为decimal,因此除法是在小数位上完成的。

如果可能,我建议将abp转换为小数,并在需要时将最终结果转换为整数。

答案 2 :(得分:0)

2/56的结果计算为整数。在分割之前,你必须转换/强制转换为十进制。

SQL>set ? = 2 / 56;
 ?
==
 0

                  1 row found

SQL>set ? = 2 * 1.0 / 56;
                ?
=================
  0.0357142857142

                  1 row found