5

我正在尝试在 SQL Server 2012 中存储度量数据(米、公里、平方米)。

最好使用的数据类型是什么?float(C#: double), decimal(C#: decimal) 甚至geometry? 还是有什么不同?

4

3 回答 3

4

decimal对您的数据具有适当精度的 a 或类型int(如果适用)

于 2012-09-25T10:48:51.817 回答
3

这完全取决于应用程序以及您需要的精度。

如果我们谈论的是架构,那么精度需求相对有限,并且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 的一个很好的替代方案,但有两个缺点:

  1. 它对应于C# Decimal为金融用途而设计的类型并防止舍入错误。当在三角方法等中使用时,这种设计使 C# Decimal 类型比 float/double 慢。您当然可以在代码中来回转换,但这不是 IMO 最直接的方法。

    “Decimal 值类型适用于需要大量有效整数和小数位且无舍入错误的财务计算。” - MSDN:十进制结构

  2. SQL DB 类型Decimal每个条目需要 5-9 个字节的存储空间(取决于使用的精度),这比 float(x) 替代方案大。
所以,根据你的需要使用它。在您的评论中,您声明它与房地产有关,所以我会选择float(24)(aka real),它正好是 4 个字节并直接转换为C# float. 请参阅:浮点数和实数 (Transact-SQL)

最后,这里是在 .Net 和 SQL 之间转换不同类型的有用资源:SqlDbType Enumeration

于 2012-09-25T10:50:55.620 回答
1

取决于您想要做什么
float 或 double 是非精确数据类型(因此 5.0 == 5.0 由于舍入问题可能为假)
Decimal 是精确数据类型(因此 5.0 == 5.0 将始终为真)
和几何/地理(容易说)用于地图上的位置。

浮点计算应该是三者中最快的,因为地理是二进制数据,带有一些关于投影的信息(这里都是关于地图的),而十进制在技术上不像浮点那么容易处理。

于 2012-09-25T10:50:13.463 回答