什么代表SQL Server中的double?


335

我有一对夫妇在性C#这是double我想将这些存储在SQL Server中的表,但发现没有double类型,所以什么是最好的使用,decimal还是float

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

感谢到目前为止的答复。


以下是CLR到SQL Server的数据类型映射:http
Achilles,2009年

MSDN上有一个很棒的线程描述了FLOAT和DECIMAL之间的主要区别。简而言之,浮点数是近似值,不能表示某些值。查看接受的答案。
马修·琼斯

Answers:


387
float

或者,如果您想去老学校:

real

您也可以使用float(53),但这与float含义相同。

(“真实”等效于float(24),而不是float / float(53)。)

小数(X,Y)的SQL Server类型是当你想确切的十进制数字,而不是浮点数(可近似)。这与C#“十进制”数据类型相反,后者更像是128位浮点数。

MSSQL的float类型等效于.NET中的64位double类型。(我在2011年的原始答案表示尾数可能会略有差异,但我在2020年对此进行了测试,它们在非常小的数字和非常大的数字二进制表示中似乎都100%兼容-请参阅https:/ /dotnetfiddle.net/wLX5Ox进行测试)。

为了使事情更加混乱,C#中的“浮点数”只有32位,因此在SQL中它与MSSQL中的real / float(24)类型等效于与float / float(53)比较。

在您的特定用例中... 您所需要的只是小数点后5位,以表示大约一米的精度内的纬度和经度,并且度数的小数点前最多只需要三位数字。浮点数(24)或十进制(8,5)最适合您在MSSQL中的需求,并且在C#中使用浮点数就足够了,您不需要加倍。实际上,您的用户很可能会感谢您舍入到小数点后5位,而不是一堆无关紧要的数字。


1
你说浮动,大卫说十进制,现在我更困惑了:)
Xaisoft

我在c#中使用double,这些值在各自的列中将是纬度和经度值。
Xaisoft

1
我必须同意,并承认我不在基地。我是在IBM DB2世界中认识到十进制的,十进制是一种实际的数据类型,IBM平台上的所有类型的代码和数据库都支持十进制。并不是说它不是MS世界中真正的数据类型,但是IBM阵营也不支持它。很抱歉造成任何混乱。
DaveN59,2009年

2
“ MSSQL浮点数的精度与.NET中的64位双精度类型不完全相同(尾数IIRC略有不同),但它与大多数用途足够接近。” 您对此有参考吗?据我所见,它们都使用53位有效数字,使用64位进行存储,并且具有与IEEE 754相同的位布局和含义
。– codekaizen

2
我对@codekaizen提出的问题也很好奇(尾数略有不同)。您是否有参考或测试可以证明这一点?
Mads Ravn


15

float是最接近的等效项。

SqlDbType枚举

对于经纬度,如OP所述。

米是纬度的1 / 40,000,000,1秒是30米左右。浮点数/双数为您提供15个有效数字。使用一些快速而狡猾的心理算术,四舍五入/近似误差将约为该填充停止点的长度->“。”


1
将您的屏幕技术卖给苹果,赚取数十亿美元!(快速算术告诉我,即使在靠近北极的南极,您也拥有我所听说过的最高分辨率;比我的高约十亿倍。)
乔纳斯·比斯特罗姆(JonasByström


8

float SQL Server中的SQL实际上具有[double:]精度(在C#方面)。

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

.NET double使用54位尾数。


2
实际上,.NET中的IIRC double使用52位尾数和11位指数。
richardtallent

我该死的 你是对的!我想知道SQL用多余的空间做什么;它不用于指数。如果确实如此,则指数将上升至+ -616而不是+ -308。也许要跟踪NULL?
Euro Micelli 2009年

现在我很困惑。每个证据都表明它们使用相同的格式(与Windows中的所有其他格式一样)。他们为什么不呢?我无法在SQL Server中找到有关按位表示形式的明确声明(除float帮助页面外)。如果发现问题,我会发布更正。
Euro Micelli 2009年

5

对于SQL Server:

十进制类型是128位带符号数字Float是64位带符号数字。

真正的答案是Float,我对小数不正确。

原因是如果使用十进制,则永远不会填充十进制类型的64位。

尽管如果尝试使用int类型,十进制不会给您错误。

是一个不错的类型参考表。


现在,两个不同的答案更加令人困惑:p
Xaisoft

1
不要困惑。这个答案是错误的。十进制是10以底的类型;浮点数(在SQL Server和CLR中)是base-2类型。
Michael Petrotta

3

听起来您可以选择。如果选择float,则可能会损失11位数字的精度。如果可以接受,那就继续吧–显然Linq设计师认为这是一个不错的权衡。

但是,如果您的应用程序需要这些额外的数字,请使用十进制。无论如何,十进制(正确实现)比浮点数更准确-从基数10到基数2以及返回基数都不会造成混乱。


这用于存储纬度和经度值。这有什么不同吗?
Xaisoft

这是错误的……MSSQL中的float / float(53)和C#中的double都具有大约15位精度。它们并不完全相同,但是足够接近。另一方面,十进制是存储双精度数的完全矫over过正,对于SQL Server中的所有计算,十进制必须返回基数2,然后以双精度返回C#。
richardtallent

我站得住了。你说的话对我完全有意义。只有在所有位置都将其保留为十进制值时,十进制才有意义。从基数10转换为基数2(然后再转换)时,您都会损失价值。
DaveN59,2009年

-2

在SQL Server中Float代表A。double您可以从Visual Studio中C#中的编码中找到证明。在这里,我在SQL Server和C#中声明Overtime为a Float。这样我就可以转换

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

这里OverTime宣布float type

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.