【问题标题】:How to get quotient and remainder when dividing decimal values?十进制除法时如何获得商和余数?
【发布时间】:2018-12-07 08:54:37
【问题描述】:

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

例如

@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

【问题讨论】:

  • 您可以在除法语句周围使用 FLOOR,并请用压力和比例声明小数。不仅仅是输入 DECIMAL。它的坏习惯。写 Decimal(18,3) fx - 35+2 % 6 不应该给 1 吗?它给出 37,可以除以 6,剩下 1 个

标签: sql-server stored-procedures


【解决方案1】:

The Docs 中的示例所示,SQL Server 中除小数时获得商的方法是将运算转换为整数:

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,Decimal数据类型的默认小数位数是0,所以如果你声明变量的时候不提供,那么小数点右边就没有数字了,@ 987654324@ 将存储为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

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 2012-05-06
    • 2012-01-09
    • 2016-02-16
    • 1970-01-01
    • 2018-06-21
    • 2010-09-12
    • 2016-07-18
    • 1970-01-01
    相关资源
    最近更新 更多