【问题标题】:How does SQL Server determine the number of significant digits when roundingSQL Server 在舍入时如何确定有效位数
【发布时间】:2014-07-28 22:08:20
【问题描述】:

我有两个需要非常精确的数据库字段 - 一列是小数 (36,12),另一列是小数 (36,24)。

当将它们相乘时,我期望会保留精度,但似乎并非如此 - 实际上我得到的精度较低。例如在运行以下 SQL 时:

SELECT 3.035 * 0.333333333333333333333333 AS Normal

SELECT CAST(3.035 AS DECIMAL(36,12)) * CAST(0.333333333333333333333333 AS DECIMAL(36,24)) AS Cast12

SELECT CAST(3.035 AS DECIMAL(36,24)) * CAST(0.333333333333333333333333 AS DECIMAL(36,24)) AS Cast24

我得到以下结果:

Normal : 1.011666666666666666666665655

Cast12 : 1.011667

Cast24 : 1.0116666666667

我猜这是因为乘法运算通常会产生“更大”的数字。我显然可以找到解决这个问题的方法(Cast24“足够好”),但我想了解 SQL Server 究竟如何确定何时舍入以及保留哪些数字?

【问题讨论】:

  • 如果您转换最终结果(在乘法之后),而不是在 相乘之前转换两个操作数,您的示例会更有意义。
  • 在我的回答中查看链接stackoverflow.com/a/5663463/73226
  • Robert... 如果您使用 "SELECT CAST(CAST(3.035 AS DECIMAL(36,24)) * CAST(0.333333333333333333333333 AS DECIMAL(36,24)) AS DECIMAL(36,24) 执行此操作)) AS Cast36",你得到1.011666666666700000000000,这仍然表明乘法运算正在失去精度。
  • 但是你是对的,如果你只转换“之后”,那么精度会被保留:“SELECT CAST(3.035 * 0.333333333333333333333333 AS DECIMAL(36,24)) AS Cast36”产生:1.011666666666666666666666跨度>

标签: sql sql-server sql-server-2008


【解决方案1】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多