【问题标题】:SQL Server - numeric and float data typesSQL Server - 数字和浮点数据类型
【发布时间】:2015-04-24 20:00:43
【问题描述】:

我无法精确到尽可能多的小数位。如果我将 6 个不同的数字转换为 numeric(36,18),然后在它们之间进行计算,结果值将被截断到小数点后 6 位。如果我使用浮动,我可以走得更远,但据我所知,这些也被切断了。

任何帮助都会很棒,谢谢。

【问题讨论】:

  • 显示您的架构和代码。
  • 为什么你认为结果在 6 处被截断?也许你的输出削减了它,但实际值是正确的?
  • 这不是 SQL Server 问题。您需要在 Web 上搜索许多文章,这些文章解释了定点数据类型 (NUMERIC) 和浮点数据类型 (FLOAT) 的行为、差异和相对优点。这些行为跨语言存在,非常值得理解。

标签: sql-server


【解决方案1】:

结果的精度:[p1 - s1 + s2 + max(6, s1 + p2 + 1)] -> 36-18+18+max(6,18+36+1)=36+55=91 结果比例:[max(6, s1 + p2 + 1)] -> max(6,18+36+1)=55 在这种情况下精度大于 38 并且在这种情况下(如文档中所述)

*结果精度和小数位数的绝对最大值为38。当结果精度大于38时,对应的小数位数为 减少以防止结果的整体部分被截断。

比例尺必须减少 (91-38=) 53,即 (55-53=) 2 ... 最小刻度长度为 6(因为表达式 scale=[max(6, s1 + p2 + 1)]) 并且不能低于 6 - 结果我们得到了

【讨论】:

    【解决方案2】:

    事情可能很棘手,具体取决于计算的顺序。

    考虑变量:

    DECLARE @A as NUMERIC(36,19) = 100
    DECLARE @B as NUMERIC(36,19) = 480
    DECLARE @C as NUMERIC(36,19) = 100
    

    计算 A/B*C

    如果你想计算 A/B*C,使用公式(@Dudi 回答),我们有:

    A/B 的类型为 NUMERIC(38,6)

    结果将是 0.208333(比例为 6)乘以 100,我们将得到 20.833300

    计算 A*C/B

    A*C 的结果是 NUMERIC(38,6) 类型的 10000。用 C 跳,结果将是 NUMERIC(38,6) 类型的 20.833333

    然后,结果可能会因计算顺序而异(https://dba.stackexchange.com/questions/77664/how-does-sql-server-determine-precision-scale 中指出了相同的问题)。

    SQL Fiddle

    【讨论】:

    • 谢谢大家。我不知道这有多复杂。
    猜你喜欢
    • 1970-01-01
    • 2020-10-22
    • 2012-01-14
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2017-03-23
    • 2017-03-15
    • 1970-01-01
    相关资源
    最近更新 更多