Sql server SQL SERVER将实数转换为十进制
我有一个旧表,其中使用了真实列。现在我们要将数据从旧表传输到列为十进制的新表 当我们使用“从旧表中选择列”时,显示的值是我们想要的,但在传输后,值不相同 SQL SERVER如何确定实际值的显示内容 例如,我有如下值Sql server SQL SERVER将实数转换为十进制,sql-server,Sql Server,我有一个旧表,其中使用了真实列。现在我们要将数据从旧表传输到列为十进制的新表 当我们使用“从旧表中选择列”时,显示的值是我们想要的,但在传输后,值不相同 SQL SERVER如何确定实际值的显示内容 例如,我有如下值 |---------------------|------------------| | displayed value | converted value | |---------------------|------------------| | 0.2885
|---------------------|------------------|
| displayed value | converted value |
|---------------------|------------------|
| 0.2885 | 0.28850001 |
|---------------------|------------------|
| 0.577 | 0.57700002 |
|---------------------|------------------|
| 0.1824634 | 0.18246342 |
|---------------------|------------------|
| 0.116691 | 0.11669103 |
|---------------------|------------------|
| 0.1040202 | 0.10402020 |
|---------------------|------------------|
| 0.1040202 | 0.10402016 |
|---------------------|------------------|
如何获取显示的值
使用convert(十进制(38,8),列)完成转换
更新
因此,我使用SSMS查看结果,并且我需要SSMS算法将实际值转换为十进制值。这个算法可用吗?你不能。
real
数据类型具有可变精度,其中asdecimal
具有固定精度(在本例中为8位小数)。因此,最终您必须选择如何为最终用户设置值的格式。您不能。real
数据类型具有可变精度,其中asdecimal
具有固定精度(在本例中为8位小数)。因此,最终您必须选择如何为最终用户设置值的格式。SQL Server不显示值。客户端应用程序(在本例中可能是SSMS)未显示完整的显示值
也就是说,以下是来自SSMS的查询和结果:
DECLARE @real_values TABLE(displayed_value real);
INSERT INTO @real_values(displayed_value)
VALUES
(0.2885)
,(0.577)
,(0.1824634)
,(0.116691)
,(0.1040202)
,(0.1040202);
SELECT displayed_value, CAST(displayed_value AS decimal(38, 8)) AS converted_value
FROM @real_values;
结果(文本):
从SQLCMD运行相同的查询时,显示的_值的结果不同,显示实际数据类型列的精度更高。如您所见,根据“显示值”列的实际值,转换后的值是正确的
displayed_value converted_value
--------------- --------------------
0.28850001 .28850001
0.57700002 .57700002
0.18246339 .18246339
0.116691 .11669100
0.1040202 .10402020
0.1040202 .10402020
还要注意的是,像real
这样的浮点类型是近似值,不能准确存储所有十进制值。这就是为什么将十进制值0.2885存储在数据类型为real
的“display\u value”列中时,其值变为0.2885001。客户端应用程序(在本例中可能是SSMS)未显示完整的显示值
也就是说,以下是来自SSMS的查询和结果:
DECLARE @real_values TABLE(displayed_value real);
INSERT INTO @real_values(displayed_value)
VALUES
(0.2885)
,(0.577)
,(0.1824634)
,(0.116691)
,(0.1040202)
,(0.1040202);
SELECT displayed_value, CAST(displayed_value AS decimal(38, 8)) AS converted_value
FROM @real_values;
结果(文本):
从SQLCMD运行相同的查询时,显示的_值的结果不同,显示实际数据类型列的精度更高。如您所见,根据“显示值”列的实际值,转换后的值是正确的
displayed_value converted_value
--------------- --------------------
0.28850001 .28850001
0.57700002 .57700002
0.18246339 .18246339
0.116691 .11669100
0.1040202 .10402020
0.1040202 .10402020
还要注意的是,像real
这样的浮点类型是近似值,不能准确存储所有十进制值。这就是为什么当以数据类型real
存储在“display_value”列中时,十进制值0.2885变为0.28850001的原因。您面临的挑战是什么?请记住,一些可以用十进制表示为精确数字的数字不能用二进制表示(正如1/3不能用十进制表示)。你的数字就是这些例子。旧_列的定义是什么?你试过十进制(38,7)吗?旧的_列是真实的,就像我在标题中说的。正如您所看到的,我使用的是十进制(38,8)。我需要它是8而不是7,因为最大数字是8。这很棘手。如果您真的希望值“按显示”显示,您会遇到一个简单的问题,即如何显示值取决于您的客户。当您在Management Studio或您的客户机中获得该表时,该数字看起来像0.2885
,并不意味着所有客户机都会决定这样显示它,因为0.2885
不能准确表示为REAL
,也不能准确表示存储的值,当以十进制数字表示时,它类似于0.288500010967254638671875
,经过适当的舍入,它实际上应该是0.28850001
。您可以首先通过字符串格式化和解析将其跳出(选择解析(格式(转换(REAL,0.2885e),'G','en-US')作为十进制(38,8)使用'en-US')
)对于“what you want”的某些值,它可能会为您提供所需的内容,但请注意,PARSE
和FORMAT
(其格式遵从.NET)可能会或可能不会提供您在屏幕上看到的值,这些值(同样)不是由SQL Server决定的,而是由您的客户端软件决定的。谨慎使用这种方法;涉及该值的计算之后可能不会产生相同的结果。您面临的挑战是什么?请记住,一些可以用十进制表示为精确数字的数字不能用二进制表示(就像1/3不能用十进制表示一样)。你的数字就是这些例子。旧_列的定义是什么?你试过十进制(38,7)吗?旧的_列是真实的,就像我在标题中说的。正如您所看到的,我使用的是十进制(38,8)。我需要它是8而不是7,因为最大数字是8。这很棘手。如果您真的希望值“按显示”显示,您会遇到一个简单的问题,即如何显示值取决于您的客户。当您在Management Studio或您的客户机中获得该表时,该数字看起来像0.2885
,并不意味着所有客户机都会决定这样显示它,因为0.2885
不能准确表示为REAL
,也不能准确表示存储的值,当以十进制数字表示时,它类似于0.288500010967254638671875
,经过适当的舍入,它实际上应该是0.28850001
。您可以首先通过字符串格式化和解析将其跳出(选择解析(格式(转换(REAL,0.2885e),'G','en-US')作为十进制(38,8)使用'en-US')
)对于“what you want”的某些值,它可能会为您提供所需的内容,但请注意,PARSE
和FORMAT
(其格式遵从.NET)可能会或可能不会提供您在屏幕上看到的值,这些值(同样)不是由SQL Server决定的,而是由您的客户端软件决定的。谨慎使用这种方法;涉及该值的计算之后可能不会产生相同的结果。如何获得SSMS用于显示实际值的算法?如何获得该算法