我在c#中有一对双属性,我想在SQL Server中存储这些表,但注意到没有双类型,所以最好使用什么,十进制或浮点数?
这将存储纬度和经度值,因此我需要最精确的精度。
谢谢你的回复。
我在c#中有一对双属性,我想在SQL Server中存储这些表,但注意到没有双类型,所以最好使用什么,十进制或浮点数?
这将存储纬度和经度值,因此我需要最精确的精度。
谢谢你的回复。
当前回答
SQL Server中的float实际上具有[编辑:几乎]“double”的精度(在c#的意义上)。
Float是Float(53)的同义词。53是尾数的位数。
. net双使用54位作为尾数。
其他回答
Float在SQL server中表示double。你可以在visual studio的c#代码中找到一个证明。在这里,我已经在SQL server和c#中声明了一个Float。这样我就能皈依
int diff=4;
attendance.OverTime = Convert.ToDouble(diff);
这里的OverTime被声明为float类型
SQL Server中的float实际上具有[编辑:几乎]“double”的精度(在c#的意义上)。
Float是Float(53)的同义词。53是尾数的位数。
. net双使用54位作为尾数。
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.
Float是最接近的对等物。
SqlDbType枚举
对于Lat/Long,如OP所述。
1米是纬度的四万分之一,1秒大约是30米。Float/double可以得到15个有效数字。用一些快速而狡猾的心算…舍入/近似误差将是这个填充停止的长度-> "。
对于SQL Sever:
十进制类型是128位有符号的数字 Float是一个64位有符号数。
真正的答案是浮点数,小数我说错了。
原因是如果你使用小数,你将永远不会填满十进制类型的64位。
尽管如果你尝试使用int类型,decimal不会给你一个错误。
这里有一个很好的类型参考图表。