2016-07-26 116 views
0

我的问题是:的SQL Server 2008+:模数和十进制/数字数据类型

是它与T-SQL decimalnumeric数据类型使用模运算%相结合的有效运行。

这似乎只要我测试过它的工作,但是这实际上是decimal值的预期的行为像SELECT 2.0 % 0.4导致0.0,我可以依靠?

我的想法是创建这样一个查询:

SELECT itemNumber 
    FROM item i 
    JOIN orderItem oi ON i.ID = oi.itemID 
    WHERE oi.orderID = @orderID 
    AND oi.amount % i.amount <> 0.0000 

实际上,我是惊讶的是,它似乎工作。这是预期的行为?

我曾期待只有为整数值工作,并准备使用不同的东西。

对于背景:

我们卖的是一些以米为单位的预包装形式我们的东西。数据库中的数据字段为numeric(18,4)值,一些预打包单元打包为十进制值。现在我必须创建一个程序来检查销售的商品是否是预先包装的单位的倍数,确定是否可以发送有效数量的预先包装物品,如果需要适当地切割物品。

回答

1

对十进制数使用%运算符很危险,因为十进制数的内部表示可能与期望不同。例如,您可以获得0.40000000000000001而不是0.4 而查询SELECT 2.0 % 0.40000000000000001将返回0.39999999999999996。 也许,你应该使用CEILING函数来获得整个项目的数量:

SELECT CEILING(2.0/0.40000000000000001) --5 
+0

随着数字(18,4)的精度应该是足够高的,我认为? – Adwaenyth

+0

@Adwaenyth它取决于你的环境,如果你测量'量'吨 - 你应该增加更多的数字在右侧,如果你使用克,我认为,这已经足够了 – Backs

+0

它实际上是米。 – Adwaenyth

相关问题