ChatGPT解决这个技术问题 Extra ChatGPT

什么代表sql server中的double?

我在 C# 中有几个属性是 double,我想将它们存储在 SQL Server 的表中,但注意到没有 double 类型,所以最好使用 decimal 或 { 5}?

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

感谢您到目前为止的回复。

以下是到 SQL Server 的 CLR 数据类型映射:http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
great thread on MSDN 描述了 FLOAT 和 DECIMAL 之间的主要区别。简而言之,Float 是近似值,不能代表某些值。查看接受的答案。

r
richardtallent
float

或者如果你想去老学校:

real

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

(“real”等价于 float(24),而不是 float/float(53)。)

当您需要精确的十进制数而不是浮点数(可以是近似值)时,使用 decimal(x,y) SQL Server 类型。这与 C#“十进制”数据类型形成对比,后者更像是 128 位浮点数。

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

更令人困惑的是,C# 中的“float”只有 32 位,因此它在 SQL 中更等同于 MSSQL 中的 real/float(24) 类型而不是 float/float(53)。

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


你说浮点数,大卫说十进制,现在我更困惑了:)
我在 c# 中使用双精度值,这些值将是它们各自列中的纬度和经度值。
我必须同意,并承认我偏离了基地。我是在 IBM DB2 世界中接触到十进制的,其中十进制是一种真正的数据类型,受到 IBM 平台上各种代码和数据库的支持。并不是说它在 MS 世界中不是真正的数据类型,而是在 IBM 阵营中不受支持。很抱歉造成任何混乱。
“MSSQL float 的精度与 .NET 中的 64 位 double 类型不完全相同(尾数 IIRC 略有不同),但它与大多数用途非常接近。”你有这方面的参考吗?据我所知,两者都使用 53 位有效位,使用 64 位进行存储,并且具有与 IEEE 754 相同的位布局和含义。
我也很好奇@codekaizen 提出的问题(尾数略有不同)。您是否有可以证明这一点的参考资料或测试?
C
Community

此外,here 是带有有用图表的 SQL-CLR 类型映射的一个很好的答案。

https://i.stack.imgur.com/HKZCS.gif


下面的链接也有用;它具有上述附加信息,因为它显示了 SqlDataReader 过程和枚举(除了 .NET 和 SQL 类型比较)docs.microsoft.com/en-us/dotnet/framework/data/adonet/…
J
Jean-François Fabre

float 是最接近的等价物。

SqlDbType Enumeration

对于 OP 提到的纬度/经度。

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


将您的屏幕技术卖给 Apple 并赚取数十亿美元! (快速算术告诉我,即使在靠近北极/南极的纬度上,你也有我听说过的最极端的分辨率;大约是我的十亿倍。)
R
RichardOD

您应该将它映射到 FLOAT(53)——这就是 LINQ to SQL does


E
Euro Micelli

SQL Server 中的 float 实际上 [编辑:几乎] 具有“双精度”(在 C# 意义上)的精度。

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

.NET double 使用 54 位作为尾数。


实际上,IIRC,.NET 中的 double 使用 52 位尾数和 11 位指数。
我会很糟糕的;你是对的!我想知道 SQL 用额外的位做什么;它不用于指数。如果是这样,指数将上升到 +-616 而不是 +-308。也许跟踪NULL?
现在我很困惑。每一条证据都表明它们使用相同的格式(与 Windows 中的所有其他内容一样)。他们为什么不呢?我在 SQL Server 中找不到关于按位表示的明确声明(除了 float 的帮助页面)。如果我发现我会发布更正。
D
David Basarab

对于 SQL 服务器:

Decimal 类型是 128 位有符号数 Float 是 64 位有符号数。

真正的答案是浮点数,我对十进制不正确。

原因是如果您使用小数,您将永远不会填充 64 位的小数类型。

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

Here 是一个很好的类型参考图表。


现在,两个不同的答案更加令人困惑:p
不要混淆。这个答案是错误的。 Decimal 是以 10 为底的类型; Float(在 SQL Server 和 CLR 中)是 base-2 类型。
D
DaveN59

听起来你可以选择。如果选择浮点数,可能会丢失 11 位精度。如果这是可以接受的,那就去做吧——显然 Linq 设计者认为这是一个很好的折衷方案。

但是,如果您的应用程序需要这些额外的数字,请使用十进制。无论如何,十进制(正确实现)比浮点更准确——没有从基数 10 到基数 2 和返回的混乱转换。


这是用于存储纬度和经度值。这有什么不同吗?
这是错误的...... MSSQL 中的 float/float(53) 和 C# 中的 double 都具有大约 15 位的精度。它们并不完全相同,但足够接近。另一方面,十进制对于存储双精度来说完全是多余的,它必须回到以 2 为底的 SQL Server 中的所有计算,并作为双精度返回到 C#。
我站得更正了。你说的对我来说很有意义。仅当您在任何地方都将其保留为十进制值时,十进制才有意义。每当您从基数 10 转换到基数 2(并返回)时,您都会失去价值。
d
d219

Float 代表 SQL Server 中的 double。您可以从 Visual Studio 中的 C# 编码中找到证明。在这里,我在 SQL Server 和 C# 中将 Overtime 声明为 Float。因此我能够转换

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

这里 OverTime 被声明为 float type