我在 C#
中有几个属性是 double
,我想将它们存储在 SQL Server 的表中,但注意到没有 double
类型,所以最好使用 decimal
或 { 5}?
这将存储纬度和经度值,因此我需要最准确的精度。
感谢您到目前为止的回复。
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 位,而不是使用一堆无关紧要的数字。
此外,here 是带有有用图表的 SQL-CLR 类型映射的一个很好的答案。
https://i.stack.imgur.com/HKZCS.gif
float 是最接近的等价物。
对于 OP 提到的纬度/经度。
一米是纬度的1/40,000,000,1秒大约是30米。浮点数/双精度数为您提供 15 个有效数字。使用一些快速而狡猾的心算......舍入/近似误差将是这个填充停止的长度 - >“。”
SQL Server 中的 float
实际上 [编辑:几乎] 具有“双精度”(在 C# 意义上)的精度。
float
是 float(53)
的同义词。 53 是尾数的位。
.NET double
使用 54 位作为尾数。
对于 SQL 服务器:
Decimal 类型是 128 位有符号数 Float 是 64 位有符号数。
真正的答案是浮点数,我对十进制不正确。
原因是如果您使用小数,您将永远不会填充 64 位的小数类型。
尽管如果您尝试使用 int 类型,十进制不会给您错误。
Here 是一个很好的类型参考图表。
听起来你可以选择。如果选择浮点数,可能会丢失 11 位精度。如果这是可以接受的,那就去做吧——显然 Linq 设计者认为这是一个很好的折衷方案。
但是,如果您的应用程序需要这些额外的数字,请使用十进制。无论如何,十进制(正确实现)比浮点更准确——没有从基数 10 到基数 2 和返回的混乱转换。
Float
代表 SQL Server 中的 double
。您可以从 Visual Studio 中的 C# 编码中找到证明。在这里,我在 SQL Server 和 C# 中将 Overtime
声明为 Float
。因此我能够转换
int diff=4;
attendance.OverTime = Convert.ToDouble(diff);
这里 OverTime
被声明为 float type