除以十进制值时如何获得商和余数?

时间:2018-06-28 10:05:07

标签: sql-server stored-procedures

我想将余数和商的值分开。

例如

@Qty = 35
@OnHand = 2
@Size = 6

Print (@Qty + @OnHand) / @Size        --(35+2)/6   I should get 6
Print (@Qty + @OnHand) % @Size        --(35+2)%6   I should get 2

假设我的@size@OnHand的分数是这样的:

@Qty = 35
@OnHand = 1.5
@Size = 2.5

Print (@Qty + @OnHand) / @Size     --(35+1.5)/2.5   I should get 14
Print (@Qty + @OnHand) % @Size     --(35+1.5)%2.5   I should get 1.5

但是当我尝试使用T-SQL时,它没有显示与上面相同的值:

CREATE PROC CalculateQty
    @Qty DECIMAL
AS
BEGIN
    DECLARE @OnHand AS DECIMAL
    DECLARE @Size AS DECIMAL

    SET @OnHand = 2
    SET @Size = 6

    PRINT (@Qty + @OnHand) / @Size   // result: 6.1666666666666
END

EXEC CalculateQty @Qty=35

同时@Size = 2.5会四舍五入并变为3。我认为这是由于变量数据类型decimal导致的,而且我无法声明float,因为使用变量时会引发错误用% modulo

计算余数

1 个答案:

答案 0 :(得分:0)

The Docs中的示例所示,除小数点后在SQL Server中获得商的方法是将操作作为整数进行CAST:

DECLARE @Qty decimal
DECLARE @OnHand AS DECIMAL
DECLARE @Size AS DECIMAL

SET @Qty = 35;
SET @OnHand = 2;
SET @Size = 6;

PRINT CAST((@Qty + @OnHand) / @Size AS Integer); --results in 6

也根据The Docs,十进制数据类型的默认小数位数为0,因此,如果在声明变量时未提供小数位数,则小数点右边将没有数字,并且1.5将存储为2

如果为小数位数的Scale参数分配足够的值,您将获得期望的结果:

DECLARE @Qty decimal(10,2)
DECLARE @OnHand AS DECIMAL(10,2)
DECLARE @Size AS DECIMAL(10,2)

SET @Qty = 35;
SET @OnHand = 1.5;
SET @Size = 2.5;

PRINT CAST((@Qty + @OnHand) / @Size AS Integer); --results in 14
Print (@Qty + @OnHand) % @Size   --results in 1.50