首页 > 解决方案 > 为什么 DECIMAL 的行为类似于 FLOAT?

问题描述

尽管它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解决了我们的问题,但我无法理解为什么它是首先引起的。

标签: sql-serverdecimalrounding

解决方案


你问,“为什么它首先是造成的”:

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

  • 整数数学会截断小数(无舍入,与“FLOOR”函数相同(这就是你得到 3329 的原因))。
  • 0 位四舍五入的小数(这就是为什么你得到 3330 作为 3329.99 向上舍入的原因)
  • 精度/比例四舍五入到第 N 比例的小数(这就是为什么你得到 3329.990366978...)。

所以这不是意外的行为,考虑到所涉及的数据类型,这是预期的。这可能只是意料之外的行为。在遇到它们之前,每种数据类型的细微差别都是有问题的。

我会选择忽略浮动评论,因为它与问题无关。


推荐阅读