SQL Server 数字格式

4
当我执行以下操作时:
DECLARE @x float
SET @x = 1234.5
SELECT CONVERT(varbinary, @x)

什么是返回格式?我需要以某种方式从.net获取原始数字,而我只有二进制值可用。
澄清:
上述语句返回
(no column name)
0x40934A0000000000

我必须从二进制数据0x40934A0000000000中获取值12345.5。


当你说“需要恢复原始数字”时,我认为你的意思是比较宽泛的。通过浮点数的往返可能会改变你的最后一位或几位数字(这取决于数字有多少十进制位以及你将其格式化为多少位)。当然,1234.5会得到正确的结果,因为它在二进制浮点数中可以精确表示。 - Rick Regan
松散地说,但我真的认为convert(float, convert(varbinary, @x))将对任何@x返回未修改的数字@x,因此该操作也可以在C#中执行,只要您知道格式。 - erikkallen
@erikkallen:但是SQL语句中的十进制字符串是原始值,对吧?"convert(float, convert(varbinary, @x))" 回路浮点值,而不是十进制值。 - Rick Regan
@erikkallen:嗯,我不是说1234.5是你唯一的值!我是指“SET @x = ...”中的任何十进制字符串。这不是你想要恢复的值吗?如果是的话,你关心的是十进制到十进制的往返,而不是浮点到浮点的往返(后者是你在评论中写的)。 (或者也许我读得太深了,你不想要原始的十进制值,只想知道它变成了什么浮点值。) - Rick Regan
@erikkallen:我认为问题不够清晰(尽管在阅读您的附加评论后,我现在明白了您想要什么)。您有一个 SQL,它从十进制字符串设置浮点变量,并且您正在寻找原始数字。我理解为您需要的是十进制字符串,因为您写道“我必须从二进制数据中获取值12345.5”。(也许如果 SQL 中有0.1,并且您说您需要0.1000000000000000055511151231257827021181583404541015625回来,我会理解的;)。) - Rick Regan
显示剩余2条评论
2个回答

0

显然,格式是IEEE 64位,但字节顺序与BitConverter.ToDouble所期望的相反。可以使用以下代码检索数字:

long bits = 0;
for (int i = 0; i < 8; i++)
    bits = (bits << 8) | data[i];
return BitConverter.Int64BitsToDouble(bits);

0
在C#中,与SQL Server的varbinary相对应的数据类型是byte[]。但是,如果您想将浮点数作为数字访问,为什么要将其转换为二进制呢?

我知道数据类型,但我需要知道实际内容的格式。我这样做的原因是在同一(视图)列中有许多不同类型的值,其中一些是UDT,因此我无法使用sql_variant。 - erikkallen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接