Sql server 将SQL Server REAL强制转换为浮点(53),无错误

Sql server 将SQL Server REAL强制转换为浮点(53),无错误,sql-server,tsql,precision,Sql Server,Tsql,Precision,在将数据从一个数据库模式传输到另一个数据库模式时,我在将REAL或FLOAT(24)转换为FLOAT(53)时遇到了一个令人困惑的错误。这两个数据库都在Linux上运行SQL Server 2017 例如,当诸如33.15或96.69之类的数据存储在REAL类型的列中时,可使用以下方法正确提取: SELECT [Value] FROM MyTable 但是,下面介绍了一些小错误: SELECT CAST([Value] as FLOAT(53)) FROM MyTable 它返回33.

在将数据从一个数据库模式传输到另一个数据库模式时,我在将
REAL
FLOAT(24)
转换为
FLOAT(53)
时遇到了一个令人困惑的错误。这两个数据库都在Linux上运行SQL Server 2017

例如,当诸如
33.15
96.69
之类的数据存储在
REAL
类型的列中时,可使用以下方法正确提取:

SELECT [Value] 
FROM MyTable 
但是,下面介绍了一些小错误:

SELECT CAST([Value] as FLOAT(53)) 
FROM MyTable
它返回
33.1500015258789
90.6900024414062

我知道大多数数字不能用浮点数精确表示,但这是从一个32位浮点数转换为64位浮点数

当从较小的近似SQL Server数据类型转换为较大的近似数据类型时,是什么导致值发生更改?对于
real
float(24)
,所需的存储大小是4字节,而对于
float(53)
,所需的存储大小是8字节,这与此有关吗

没有错误


33.15
不能精确表示为32位浮点。因此,您看到的是,当精度更高时,它的表示更精确。

谢谢!虽然32位浮点数至少有6位数字,但32位浮点数用4位数字表示,这让我有点吃惊。现在我意识到剩下的数字仅仅是零,因为预期值和存储值的差异非常小。