C# 什么代表sql server中的双精度?

C# 什么代表sql server中的双精度?,c#,sql,sql-server,sql-server-2005,tsql,C#,Sql,Sql Server,Sql Server 2005,Tsql,我在C#中有两个属性,它们是double,我想将它们存储在SQL Server中的一个表中,但是注意到没有double类型,所以最好使用decimal还是float 这将存储纬度和经度值,因此我需要最精确的精度 感谢到目前为止的回复 float 或者,如果你想上老派学校: real 您也可以使用float(53),但它的含义与float相同 (“真实”相当于浮动(24),而不是浮动/浮动(53)。) 十进制(x,y)SQL Server类型适用于需要精确十进制数而不是浮点(可以是近似值)的情

我在
C#
中有两个属性,它们是
double
,我想将它们存储在SQL Server中的一个表中,但是注意到没有
double
类型,所以最好使用
decimal
还是
float

这将存储纬度和经度值,因此我需要最精确的精度

感谢到目前为止的回复

float
或者,如果你想上老派学校:

real
您也可以使用float(53),但它的含义与float相同

(“真实”相当于浮动(24),而不是浮动/浮动(53)。)

十进制(x,y)SQL Server类型适用于需要精确十进制数而不是浮点(可以是近似值)的情况。这与C#“decimal”数据类型形成对比,后者更像是一个128位浮点数

MSSQL的float类型相当于.NET中的64位double类型。(我2011年的原始答案是尾数可能略有不同,但我在2020年对此进行了测试,它们在二进制表示非常小和非常大的数字时似乎100%兼容——请参阅我的测试)

更让人困惑的是,C#中的“float”仅为32位,因此在SQL中,它与MSSQL中的real/float(24)类型比float/float(53)更等效

在您的特定用例中… 您只需在小数点后5位就可以表示精度在1米以内的纬度和经度,而度的小数点前最多只需要3位数字。Float(24)或decimal(8,5)在MSSQL中最适合您的需要,在C#中使用Float就足够了,您不需要使用double。事实上,您的用户可能会感谢您将小数点四舍五入到5位,而不是让一堆无关紧要的数字出现。

对于SQL Server:

十进制类型是128位有符号数 浮点是一个64位有符号数

真正的答案是浮动,我对小数点的看法是错误的

原因是如果使用十进制,则永远不会填充十进制类型的64位

尽管decimal不会在尝试使用int类型时给出错误


是一个很好的类型参考图表。

您应该将其映射到FLOAT(53)-这就是问题所在。

FLOAT
在SQL Server中实际上具有[编辑:几乎]双精度(从C的意义上说)

float
float(53)
的同义词。53是尾数的一部分


.NET
double
使用54位作为尾数。

float是最接近的等价项

对于Lat/如OP所述


一米是纬度的1/40000000,1秒大约是30米。Float/double给出15个有效数字。用一些快速而狡猾的心算。。。舍入/近似误差与此填充停止点的长度大致相同->“

听起来您可以选择。如果选择float,可能会丢失11位精度。如果这是可以接受的,那就去做吧——显然Linq设计师认为这是一个很好的折衷方案

但是,如果应用程序需要这些额外的数字,请使用十进制。十进制(正确实现)无论如何都比浮点更精确——从10进制到2进制再到2进制都不会有混乱的转换。

此外,对于SQL-CLR类型映射来说,使用有用的图表也是一个很好的答案

从该职位(通过):
A
Float
表示SQL server中的
double
。您可以从visual studio中的C#编码中找到证据。在这里,我在SQL server和C#中声明了
超时
浮点
。这样我就可以皈依了

int diff=4;
attendance.OverTime = Convert.ToDouble(diff);

这里声明了超时时间浮点类型

你说浮点,大卫说十进制,现在我更困惑了:)我在c#中使用了双精度,这些值将是各自列中的纬度值和经度值。我必须同意,并且承认我偏离了基准。我是在IBMDB2世界中被介绍到decimal的,decimal是一种真正的数据类型,IBM平台上的所有代码和数据库都支持decimal。并不是说它在MS世界中不是一种真正的数据类型,而是它没有IBM阵营支持的那么好。很抱歉造成混淆。“MSSQL浮点与.NET中的64位双精度类型(尾数IIRC稍有不同)的精度不完全相同,但它与大多数用户使用的非常接近。”您对此有参考资料吗?就我所见,两者都使用53位有效位,使用64位存储,并且具有与IEEE 754相同的位布局和含义。我还对@codekaizen提出的问题很好奇(尾数略有不同)。你有没有一个参考或测试来证明这一点?现在有两个不同的答案更让人困惑:不要困惑。这个答案是错误的。十进制是以10为基数的类型;Float(在SQL Server和CLR中)是base-2类型。用于存储纬度和经度值。这有区别吗?这是错误的。。。MSSQL中的float/float(53)和C#中的double都有大约15位精度。它们并不完全相同,但足够接近。另一方面,十进制对于存储一个double来说完全是过火了,在SQL Server中,所有计算都必须返回到基数2,然后作为double返回到C#。我的观点是正确的。你说的对我来说很有道理。只有在任何地方都将其保留为十进制值时,十进制才有意义。当你从10进制转换到2进制时,你就会失去价值。实际上,IIRC,double在.NET中使用52位尾数和11位指数;你说得对!我想知道SQL使用额外的位做什么;它不用于指数。如果有,指数将上升到+-616,而不是+-308。也许跟踪空?现在我很困惑。每一条证据都指向这样一个观点,即它们使用相同的格式(正如我所说的所有其他格式一样)