【问题标题】:Arithmetic operation with numeric datatype in SQL server yields different resultsSQL Server 中数值数据类型的算术运算产生不同的结果
【发布时间】:2015-02-11 18:33:28
【问题描述】:

使用实数和数字数据类型时,我得到不同的结果。 当我使用 real 作为数据类型时,我得到 finalValue 作为 -139.2466,当我使用数字数据类型时,我得到 finalVaue 作为--139.246409。哪个值是正确的? 当我将这些数字插入 Excel 时,它与值 -139.2466 匹配。 对于.eg

create table #resr ( a1 real, a2 real, a3 real)
insert #resr select  0.471163361822717, 0.0096160000 , 0.001669000000000
select a1*a2*-51.295/a3 finalValue from #resr

create table #resn ( a1 numeric(30,15), a2 numeric(30,15), a3 numeric(30,15))
insert #resn select  0.471163361822717, 0.0096160000 , 0.001669000000000
select a1*a2*-51.295/a3 finalValue from #resn

【问题讨论】:

  • 在第一个示例中,您使用的是近似数据类型,因此不应该期望得到准确的结果

标签: sql sql-server numeric


【解决方案1】:

浮点数据类型(REAL 是其中的成员)是近似值,可以使用多种算法中的任何一种来对数字序列进行编码,从而导致它们在 SQL 中的解释方式存在细微差别。这就是你可以有一个 float(10) 值 1234567890 和 .1234567890 的原因

select cast(1234567890 as float(10))
select cast(.1234567890 as float(10))

精确值(例如 Decimal 和 Numeric)准确定义了允许的小数位数,并为任何已定义的数字填充零。

浮点数使您能够对更广泛的数字进行建模,因为您可以通过允许小数点“浮动”而不是内存中的固定点来允许极大的数字和极小的数字。在大多数情况下它们也很好,因为通常您丢失的小数精度并不是什么大问题。它们也往往小于精确的数据类型(并非总是如此)。但是,如果您提前知道预期值的大小,通常最好使用小数。

哪个值是“正确的”?数值。如果您曾经将数字的浮点表示与精确表示进行比较,请使用精确表示。

【讨论】:

  • 为了完整起见,您可能需要在 sql-server 中添加,REAL 是一种非常小的(因此非常不精确)数据类型,只有 4 个字节,并且只定义为 7 位的精度。见msdn.microsoft.com/en-us/library/ms173773.aspx
猜你喜欢
  • 1970-01-01
  • 2011-07-31
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
相关资源
最近更新 更多