为啥将 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 实际存储的值,这是估计值,而不是我给它的值。肯定这个数据类型应该是十进制的。Real
和 float
不是估计的,而 decimal
是精确的。 Real
和 float
是基于二进制的,而 decimal
是基于十进制的。 decimal
将 1 除以 3,会得到舍入误差。
正确的术语是近似的而不是估计的。我会更正答案。
@EricPostpischil 所有数据都以二进制形式存储。浮点数和实数使用一种近似算法,该算法放弃了准确性以提高存储效率。
@SQLRaptor: Float
和 real
将数字表示为有效数字乘以 2 的幂。 decimal
表示一个数字作为有效数字乘以十的幂。 两种表示方式都无法表示所有实数,并且两种表示方式都存在舍入误差。正如我所写,以十进制格式将 1 除以 3 会产生舍入误差。以上是关于为啥将 SQL Real 转换为 Numeric 时比例会略有增加?的主要内容,如果未能解决你的问题,请参考以下文章
如何更正将 nvarchar 转换为 sql 数据类型 numeric(9, 4) 的数字的算术溢出错误? [关闭]
如何使用非默认 NLS_NUMERIC_CHARACTERS 在 Oracle PL/SQL 中有效地将文本转换为数字?
SQL怎么样把numeric类型的数据转换为varchar类型的数据