我在c#中有一对双属性,我想在SQL Server中存储这些表,但注意到没有双类型,所以最好使用什么,十进制或浮点数?

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

谢谢你的回复。


float

或者如果你想走老派路线:

real

你也可以使用float(53),但它的意思和float是一样的。

(“real”相当于float(24),而不是float/float(53)。)

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

MSSQL的浮点类型相当于。net中的64位双类型。(我2011年的原始答案说尾数可能会有轻微的差异,但我在2020年进行了测试,它们在非常小和非常大的数字的二进制表示中似乎100%兼容——请参阅https://dotnetfiddle.net/wLX5Ox查看我的测试)。

更让人困惑的是,c#中的“float”只有32位,所以它在SQL中更相当于MSSQL中的real/float(24)类型,而不是float/float(53)。

In your specific use case... All you need is 5 places after the decimal point to represent latitude and longitude within about one-meter precision, and you only need up to three digits before the decimal point for the degrees. Float(24) or decimal(8,5) will best fit your needs in MSSQL, and using float in C# is good enough, you don't need double. In fact, your users will probably thank you for rounding to 5 decimal places rather than having a bunch of insignificant digits coming along for the ride.

对于SQL Sever:

十进制类型是128位有符号的数字 Float是一个64位有符号数。

真正的答案是浮点数,小数我说错了。

原因是如果你使用小数,你将永远不会填满十进制类型的64位。

尽管如果你尝试使用int类型,decimal不会给你一个错误。

这里有一个很好的类型参考图表。

你应该把它映射到FLOAT(53)——这就是LINQ to SQL所做的。

SQL Server中的float实际上具有[编辑:几乎]“double”的精度(在c#的意义上)。

Float是Float(53)的同义词。53是尾数的位数。

. net双使用54位作为尾数。

Float是最接近的对等物。

SqlDbType枚举

对于Lat/Long,如OP所述。

1米是纬度的四万分之一,1秒大约是30米。Float/double可以得到15个有效数字。用一些快速而狡猾的心算…舍入/近似误差将是这个填充停止的长度-> "。

听起来你可以挑挑拣拣。如果你选择浮点数,你可能会损失11位精度。如果这是可以接受的,那就去做吧——显然Linq设计师认为这是一个很好的权衡。

但是,如果应用程序需要这些额外的数字,则使用decimal。Decimal(正确实现)比float(浮点数)准确得多——没有从10进制到2进制再返回的混乱转换。

另外,这里有一个关于SQL-CLR类型映射的很好的答案,其中有一个有用的图表。

从那篇文章(大卫):

Float在SQL server中表示double。你可以在visual studio的c#代码中找到一个证明。在这里,我已经在SQL server和c#中声明了一个Float。这样我就能皈依

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

这里的OverTime被声明为float类型