为什么DECIMAL表现得像FLOAT?

时间:2018-10-17 12:27:13

标签: sql-server decimal rounding

尽管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解决了我们的问题,但我无法一开始就弄清楚为什么是这种原因。

1 个答案:

答案 0 :(得分:3)

您问“首先是为什么引起的”:

要知道为什么需要了解每种数据类型的性质以及它在SQL Server中的运行方式。

  • 整数数学会截断小数点(不舍入,与“ FLOOR”函数相同(这就是为什么得到3329的原因))。
  • 舍入为0的十进制小数(这就是为什么您将3329.99向上舍入为3330的原因)
  • 将精度/比例的小数舍入为N位数(这就是为什么获得3329.990366978 ...的原因)。

所以这不是意外行为,考虑到涉及的数据类型,这是预期的。可能只是出乎意料的行为。每种数据类型的细微差别都可能是有问题的,直到有人碰到它们为止。

由于与问题无关,我将选择忽略浮动注释。