什么代表在SQL Server的双重?
我有一些在C#
的属性是double
,我想将它们存储在SQL Server的表中,但注意到没有double
types,那么最好使用什么, decimal
或float
?
这将存储经度和纬度值,所以我需要最准确的精度。
感谢迄今的回应。
float
或者如果你想去老派:
real
你也可以使用float(53),但它和float一样。
(“真”相当于float(24),而不是float / float(53)。)
十进制(x,y) SQL Servertypes用于当您需要精确十进制数而不是浮点数(可以是近似值)时。 这与C#“十进制”数据types相反,它更像是一个128位浮点数。
MSSQL 浮点数与.NET中的64位双精度types的精确度并不完全相同 (尾数IIRC中的细微差别),但是这是大部分使用的足够接近的匹配。
为了使事情变得更加混乱,C#中的“float”只有32位,所以在SQL中与float / float(53)中的real / float(24)types更相似。
在您的具体使用情况下…您只需要小数点后5个位置表示纬度和经度在一米左右的精度内,您只需要小数点前三位即可。 浮点数(24)或十进制数(8,5)将最适合您在MSSQL中的需求,并且在C#中使用float已经足够了,您不需要翻倍。 事实上,你的用户可能会感谢你凑到5位小数,而不是有一堆微不足道的数字。
以下是到SQL Server的CLR数据types映射: http : //msdn.microsoft.com/zh-cn/library/system.data.sqldbtype.aspx
此外, 这里是一个有用的图表SQL-CLRtypes映射的一个很好的答案。
从那个post(由大卫 ):
正如大多数人所指出的, float
是正确的答案。 有关更多信息,请参阅Microsoft的SQL Server上的文档 – CLR数据types映射 。
浮动是最接近的等值。
SqlDbType枚举
编辑:
对于纬度/长与OP提到。
一米是纬度的四千万分之一,一秒是三十米左右。 浮动/双重给你15位有效数字。 用一些快速和狡猾的心算……舍入/近似误差将是关于这个填充停止的长度 – “”。
你应该把它映射到FLOAT(53) – 这就是LINQ to SQL所做的 。
在SQL Server中实际上具有[编辑:几乎]一个“双”(在C#意义上)的精度。
float
是float(53)
的同义词。 53是尾数的位。
.NET double
使用54位作为尾数。
MSDN上有一个很好的线索,描述了FLOAT和DECIMAL之间的主要区别。 简而言之,Float是近似值,不能代表某些值。
看看接受的答案。
对于SQL服务器:
十进制types是128位有符号数Float是一个64位有符号数。
真正的答案是浮动 ,我对小数不正确。
原因是如果你使用小数,你永远不会填充十进制types的64位。
尽pipe如果你尝试使用inttypes,decimal不会给你一个错误。
这是一个很好的types的参考图表。
这听起来像你可以挑选。 如果你select浮动,你可能会失去11个数字的精度。 如果这是可以接受的,那就去做 – 显然Linq的devise者认为这是一个很好的折衷。
但是,如果您的应用程序需要这些额外的数字,请使用小数 十进制(正确实施)比浮动方式更精确 – 从基数10到基数2以及后面没有杂乱的翻译。
@Achilles优秀! 来到这里的双TinyInt留下来。
这里是一个部分完成的开关情况下,在dataTable和SQL之间进行转换:
switch (columnDataTypeList[i]) { case "System.String": columnDataTypeList[i] = "VARCHAR(MAX)"; break; case "System.Int32": columnDataTypeList[i] = "INT"; break; case "System.DateTime": columnDataTypeList[i] = "DATE"; break; case "System.Double": columnDataTypeList[i] = "FLOAT"; break; }
string可能是一个问题,一定要编辑它,以满足您的需求,但双重应该工作,这是目前的问题。
System.Data.Sql类中没有映射吗?
请参阅: C#:.NET Framework中的SQL Server数据types等效项 。
现在,让我的浮动…