为啥将 SQL Real 转换为 Numeric 时比例会略有增加?

Posted

技术标签:

【中文标题】为啥将 SQL Real 转换为 Numeric 时比例会略有增加?【英文标题】:Why when converting SQL Real to Numeric does the scale slightly increase?为什么将 SQL Real 转换为 Numeric 时比例会略有增加? 【发布时间】:2019-09-07 21:44:26 【问题描述】:

我将值 (0.15) 作为 Real 数据类型存储在 SQL 的 Quantity 字段中。

只是玩玩,当我投射为数字时,比例有一些非常细微的变化。

我不确定为什么会出现这种情况,以及为什么会出现这些特定数字?

select CAST(Quantity AS numeric(18,18)) -- Quantity being 0.15

返回

 0.150000005960464480

【问题讨论】:

【参考方案1】:

Real 和 float 是近似数字,而不是精确数字。如果您需要精确的,请使用 DECIMAL。 估计的好处是它们允许使用更少的存储字节存储非常大的数字。 https://docs.microsoft.com/en-us/sql/t-sql/data-types/float-and-real-transact-sql?view=sql-server-2017

PS:数字和小数是同义词。

PS2:请参阅下面 Eric 的 Postpischil 澄清评论: “浮点数和实数将一个数字表示为一个有效数字乘以 2 的幂。十进制表示一个数字作为一个有效数字乘以十的幂。两种表示方式都无法表示所有实数,并且两种表示方式都受制于舍入错误。正如我所写,以十进制格式将 1 除以 3 将产生舍入错误"

【讨论】:

好的,所以它显示了 SQL 实际存储的值,这是估计值,而不是我给它的值。肯定这个数据类型应该是十进制的。 Realfloat 不是估计的,而 decimal 是精确的。 Realfloat 是基于二进制的,而 decimal 是基于十进制的。 decimal 将 1 除以 3,会得到舍入误差。 正确的术语是近似的而不是估计的。我会更正答案。 @EricPostpischil 所有数据都以二进制形式存储。浮点数和实数使用一种近似算法,该算法放弃了准确性以提高存储效率。 @SQLRaptor: Floatreal 将数字表示为有效数字乘以 2 的幂。 decimal 表示一个数字作为有效数字乘以十的幂。 两种表示方式都无法表示所有实数,并且两种表示方式都存在舍入误差。正如我所写,以十进制格式将 1 除以 3 会产生舍入误差。

以上是关于为啥将 SQL Real 转换为 Numeric 时比例会略有增加?的主要内容,如果未能解决你的问题,请参考以下文章

如何更正将 nvarchar 转换为 sql 数据类型 numeric(9, 4) 的数字的算术溢出错误? [关闭]

如何使用非默认 NLS_NUMERIC_CHARACTERS 在 Oracle PL/SQL 中有效地将文本转换为数字?

SQL怎么样把numeric类型的数据转换为varchar类型的数据

为啥这个 SQL 查询失败

SQL怎么样把numeric类型的数据转换为varchar类型的数据

SQL怎么样把numeric类型的数据转换为varchar类型的数据