尽管DECIMAL
是精确的数字类型(与FLOAT
不同,后者是近似的),但在下面的示例中它的表现却很奇怪:
DECLARE @DECIMAL_VALUE1 DECIMAL(20,9) = 504.70 / 0.151562
DECLARE @DECIMAL_VALUE2 DECIMAL(20,0) = 504.70 / 0.151562
DECLARE @INTEGER_VALUE INT = 504.70 / 0.151562
SELECT
@DECIMAL_VALUE1 AS DECIMAL_VALUE1, -- 3329.990366978
@DECIMAL_VALUE2 AS DECIMAL_VALUE2, -- 3330
@INTEGER_VALUE AS INTEGER_VALUE -- 3329
3329以外的其他值会导致我们的应用程序出现错误。将变量类型设置为INTEGER
解决了我们的问题,但我无法一开始就弄清楚为什么是这种原因。
答案 0 :(得分:3)
您问“首先是为什么引起的”:
要知道为什么需要了解每种数据类型的性质以及它在SQL Server中的运行方式。
所以这不是意外行为,考虑到涉及的数据类型,这是预期的。可能只是出乎意料的行为。每种数据类型的细微差别都可能是有问题的,直到有人碰到它们为止。
由于与问题无关,我将选择忽略浮动注释。