我正在尝试在SQL Server 2012中存储指标数据(米,公里,平方米)。
使用的最佳数据类型是什么? float
(C#:double),decimal
(C#:十进制)或甚至geometry
?还是别的什么?
答案 0 :(得分:4)
您的数据具有适当精确度的decimal
或适当的int
类型
答案 1 :(得分:3)
这完全取决于应用程序以及它所需的精度。
如果我们谈论架构,那么精度需求相对有限,而C# 32-bit float
将带您走很长的路。在SQL中,这转换为float(24)
,也称为数据库类型real
。此SQL DB类型每个条目需要4个字节的存储空间。
如果我们想要解决地球表面上的点,则需要更高的精度。这里C# double
是合适的,对应于SQL float(53)
或float
。此SQL DB类型需要8个字节的存储空间,并且仅在需要时或者应用程序很小且磁盘/内存使用不是问题时才应使用。
SQL Decimal
可能是实际SQL DB的一个很好的替代方案,但有两个缺点:
C# Decimal
,这是一种专为财务使用而设计的类型,可防止出现舍入错误。当在三角函数方法等中使用时,这种设计使得C#Decimal类型比float / double更慢。您当然可以在代码中来回转换它,但这不是最直接的IMO方法。“十进制值类型适用于需要大量有效积分和小数位且没有舍入误差的财务计算。” - MSDN : Decimal Structure
Decimal
每个条目需要5-9个字节的存储空间(取决于使用的精度),这大于浮点数(x)。float(24)
(又名real
),这恰好是4个字节并直接转换为C# float
。请参阅:float and real (Transact-SQL)
最后,这是一个在.Net和SQL之间转换不同类型的有用资源:SqlDbType Enumeration
答案 2 :(得分:1)
取决于你想做什么
float或double是非精确数据类型(因为舍入问题,5.0 == 5.0可能是假的)
十进制是一个确切的数据类型(所以5.0 == 5.0将永远为真)
和Geometry / Geography(简单说明)适用于地图上的位置。
浮点计算应该是三者之间的关系,因为地理是二进制数据,有一些关于投影的信息(这里所有关于地图的信息)和十进制在技术上并不像浮动那样容易处理。