SQL Server 2008+:模数和小数/数字数据类型

SQL Server 2008+: Modulo and Decimal / Numeric data type

我的问题是:

在 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) 值,一些预先打包的单位被打包为十进制值。现在我必须创建一个程序来检查所售商​​品是否是预包装单位的倍数,确定我们是否可以发送有效数量的预包装商品,以及是否有必要适当地切割商品。

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

SELECT CEILING(2.0 / 0.40000000000000001) --5