我在C#
中有几个double
属性,我想将它们存储在SQL Server的一个表中,但是注意到没有double
类型,那么什么是最好用,decimal
或float
?
这将存储纬度和经度值,因此我需要最准确的精度。
感谢到目前为止的回复。
答案 0 :(得分:354)
float
或者如果你想上老学:
real
你也可以使用float(53),但它与float相同。
(“real”相当于float(24),而不是float / float(53)。)
十进制(x,y) SQL Server类型适用于需要精确十进制数而不是浮点数(可以是近似值)的情况。这与C#“十进制”数据类型形成对比,后者更像是一个128位浮点数。
MSSQL float 与完全的精度不同于.NET中的64位 double 类型(尾数IIRC略有差异) ,但它足以与大多数用途相匹配。
为了让事情更加混乱,C#中的“float”只有32位,因此在SQL中,它与MSSQL中的real / float(24)类型相比,与float / float(53)相当。
在您的具体用例中...... 您所需要的只是小数点后面的5个位置,表示大约一米精度内的纬度和经度,并且您只需要在小数点前最多三位数。 Float(24)或十进制(8,5)最适合您在MSSQL中的需求,并且在C#中使用float是足够好的,您不需要double。事实上,您的用户可能会感谢您将其舍入到小数点后5位,而不是为了骑行而出现一堆无关紧要的数字。
答案 1 :(得分:44)
答案 2 :(得分:14)
float是最接近的等价物。
编辑:
对于OP提到的Lat / Long。
一米是纬度的1 / 40,000,000,1秒是30米左右。 Float / double给你15个有效数字。使用一些快速和狡猾的心算... ...舍入/近似误差将是关于该填充停止的长度 - > “”
答案 3 :(得分:14)
正如大多数人所说,float
是正确答案。有关详细信息,请参阅Microsoft's documentation on SQL Server - CLR datatype mapping。
答案 4 :(得分:9)
你应该将它映射到FLOAT(53) - 这就是LINQ to SQL does。
答案 5 :(得分:7)
float
实际上[编辑:几乎]精度为“double”(在C#意义上)。
float
是float(53)
的同义词。 53是尾数的位。
.NET double
使用54位作为尾数。
答案 6 :(得分:5)
对于SQL Sever:
十进制类型是128位有符号数 Float是64位有符号数。
真正的答案是 Float ,我对小数字不正确。
原因是如果使用小数,则永远不会填充64位的十进制类型。
虽然如果你尝试使用int类型,decimal不会给你一个错误。
Here是一个很好的参考图表类型。
答案 7 :(得分:5)
有一个great thread on MSDN描述了FLOAT和DECIMAL之间的主要区别。简而言之,Float是近似值,不能代表某些值。
看看接受的答案。
答案 8 :(得分:3)
@Achilles非常好!来到这里为TinyInt留了双倍。
以下是在dataTable和SQL之间进行转换的部分完成的switch case:
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;
}
字符串可能是一个问题,请务必根据您的需要进行编辑,但双重应该可以解决手头的问题。
答案 9 :(得分:2)
听起来你可以挑选。如果选择float,则可能会丢失11位精度。如果这是可以接受的,那就去吧 - 显然Linq设计师认为这是一个很好的权衡。
但是,如果您的应用程序需要这些额外数字,请使用小数。无论如何,十进制(正确实现)比浮点更准确 - 从基数10到基数2和背面没有杂乱的转换。
答案 10 :(得分:1)
System.Data.Sql类中是否已存在映射?
请参阅:C#: SQL Server data types equivalents in .NET Framework。
现在,让我的漂浮......
答案 11 :(得分:1)
如果这是有用的,下面是我通常所指的链接(这次我最终在第一个谷歌的这个帖子!)。
它包含以前发布的链接的附加信息,因为它显示了SqlDataReader过程和枚举(除了.NET和SQL类型比较)
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings
(是的漂浮!)
答案 12 :(得分:-1)
Float
表示SQL Server中的double
。您可以在Visual Studio中的C#中找到编码证明。在这里,我在SQL服务器和C#中将Overtime
声明为Float
。因此我能够转换
int diff=4;
attendance.OverTime = Convert.ToDouble(diff);
此处OverTime
已声明为float type