SQL Server 2008+:模数和小数/数字数据类型
SQL Server 2008+: Modulo and Decimal / Numeric data type
我的问题是:
在 T-SQL 中将模运算符 %
与 decimal
或 numeric
数据类型结合使用是否有效?
据我测试它似乎有效,但这实际上是 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
我的问题是:
在 T-SQL 中将模运算符 %
与 decimal
或 numeric
数据类型结合使用是否有效?
据我测试它似乎有效,但这实际上是 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