我正在尝试在 SQL Server 2012 中存储度量数据(米、公里、平方米)。
最好使用的数据类型是什么?float
(C#: double), decimal
(C#: decimal) 甚至geometry
? 还是有什么不同?
我正在尝试在 SQL Server 2012 中存储度量数据(米、公里、平方米)。
最好使用的数据类型是什么?float
(C#: double), decimal
(C#: decimal) 甚至geometry
? 还是有什么不同?
decimal
对您的数据具有适当精度的 a 或类型int
(如果适用)
这完全取决于应用程序以及您需要的精度。
如果我们谈论的是架构,那么精度需求相对有限,并且C# 32-bit float
会带您走很长一段路。在 SQL 中,这转换为float(24)
,也称为数据库类型real
。此 SQL DB 类型每个条目需要 4 个字节的存储空间。
如果我们想要处理地球表面上的点,则需要更高的精度。这里 aC# double
是合适的,它对应于 aSQL float(53)
或 just float
。这种 SQL DB 类型需要 8 个字节的存储空间,并且应该仅在需要或应用程序很小且磁盘/内存使用不重要时才使用。
这SQL Decimal
可能是实际 SQL DB 的一个很好的替代方案,但有两个缺点:
C# Decimal
为金融用途而设计的类型并防止舍入错误。当在三角方法等中使用时,这种设计使 C# Decimal 类型比 float/double 慢。您当然可以在代码中来回转换,但这不是 IMO 最直接的方法。“Decimal 值类型适用于需要大量有效整数和小数位且无舍入错误的财务计算。” - MSDN:十进制结构
Decimal
每个条目需要 5-9 个字节的存储空间(取决于使用的精度),这比 float(x) 替代方案大。float(24)
(aka real
),它正好是 4 个字节并直接转换为C# float
. 请参阅:浮点数和实数 (Transact-SQL)
最后,这里是在 .Net 和 SQL 之间转换不同类型的有用资源:SqlDbType Enumeration
取决于您想要做什么
float 或 double 是非精确数据类型(因此 5.0 == 5.0 由于舍入问题可能为假)
Decimal 是精确数据类型(因此 5.0 == 5.0 将始终为真)
和几何/地理(容易说)用于地图上的位置。
浮点计算应该是三者中最快的,因为地理是二进制数据,带有一些关于投影的信息(这里都是关于地图的),而十进制在技术上不像浮点那么容易处理。