【问题标题】:What represents a double in sql server?什么代表sql server中的double?
【发布时间】:2010-11-15 14:27:11
【问题描述】:

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

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

感谢到目前为止的回复。

【问题讨论】:

标签: c# sql sql-server sql-server-2005 tsql


【解决方案1】:
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 位双精度类型不完全相同(尾数 IIRC 略有不同),但它与大多数用途的匹配度足够接近。"你有这方面的参考吗?据我所知,两者都使用 53 位有效位,使用 64 位进行存储,并且具有与 IEEE 754 相同的位布局和含义。
  • 我也很好奇@codekaizen 提出的问题(尾数略有不同)。您有可以证明这一点的参考资料或测试吗?
【解决方案2】:

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

来自该帖子(David):

【讨论】:

【解决方案3】:

float 是最接近的等价物。

SqlDbType Enumeration

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

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

【讨论】:

  • 把你的屏幕技术卖给苹果,赚几十亿! (快速算术告诉我,即使在靠近北极/南极的纬度上,你也有我听说过的最极端的分辨率;大约是我的十亿倍。)
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

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

    对于 SQL 服务器:

    十进制类型是 128 位有符号数 浮点数是 64 位有符号数。

    真正的答案是浮点数,我对小数的理解是错误的。

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

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

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

    【讨论】:

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

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

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

    【讨论】:

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

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

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

    这里OverTime被声明为float type

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2010-09-29
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2014-05-14
      相关资源
      最近更新 更多