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。也许跟踪空?现在我很困惑。每一条证据都指向这样一个观点,即它们使用相同的格式(正如我所说的所有其他格式一样)