Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL SERVER将实数转换为十进制_Sql Server - Fatal编程技术网

Sql server SQL SERVER将实数转换为十进制

Sql server SQL SERVER将实数转换为十进制,sql-server,Sql Server,我有一个旧表,其中使用了真实列。现在我们要将数据从旧表传输到列为十进制的新表 当我们使用“从旧表中选择列”时,显示的值是我们想要的,但在传输后,值不相同 SQL SERVER如何确定实际值的显示内容 例如,我有如下值 |---------------------|------------------| | displayed value | converted value | |---------------------|------------------| | 0.2885

我有一个旧表,其中使用了真实列。现在我们要将数据从旧表传输到列为十进制的新表

当我们使用“从旧表中选择列”时,显示的值是我们想要的,但在传输后,值不相同

SQL SERVER如何确定实际值的显示内容

例如,我有如下值

|---------------------|------------------|
| 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
数据类型具有可变精度,其中as
decimal
具有固定精度(在本例中为8位小数)。因此,最终您必须选择如何为最终用户设置值的格式。

您不能。
real
数据类型具有可变精度,其中as
decimal
具有固定精度(在本例中为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用于显示实际值的算法?如何获得该算法