【问题标题】:C# correct alternative for SQL NumericSQL Numeric 的 C# 正确替代方案
【发布时间】:2014-04-03 12:32:21
【问题描述】:

我一直在玩 Numerics 和 c# 128 位对应十进制,并注意到一些差异。其一,C# decimal 是 128 位,而 SQL numeric 占用一个额外的字节。

我想知道的是:在 C# 中实现数字/十进制的“正确”(快速)符合 SQL 的方法是什么(就像一个“学术问题”)?

哦,让问题更难一点:

  • 当然我希望数据结构占用尽可能少的字节。
  • 与 C# 中的普通“十进制”一样,我希望能够进行加、减、除和乘。

因为 17 字节的数字是最难的,这才是我真正感兴趣的。其他精度只是它的变体,可能需要另一个结构。

【问题讨论】:

    标签: c# sql .net algorithm numeric


    【解决方案1】:

    System.Data.SqlTypes.SqlDecimal 已经提供了这个。它也提供算术。

    【讨论】:

    • 请注意 MSDN 中的这一点:SqlDecimal 具有与其对应的 .NET Framework Decimal 数据类型不同的基础数据结构。十进制没有精度的概念。它使用 3 个字节来存储实际数据,因此最大刻度为 28,范围为 ((-2^96 到 2^96) / 10^(0 到 28))。 SqlDecimal 具有精度和规模。它使用 4 个无符号 4 字节整数来存储实际数据,因此最大精度和小数位数为 38。数据范围为 - 10^38 +1 到 10^38 - 1。
    • @IainBallard 应该读作“警告:SqlDecimal 正确,因为它与 SQL 语义匹配”
    • @RemusRusanu 很好,我不知道这门课。即使 SqlDecimal 使用 20 个字节而不是 17 个字节,我想在 SQL 中这 3 个字节的元数据存储在表模式中,这导致了 17 个字节。 (我知道这并不重要,因为无论如何它们都是分配的,但我们在这里谈论学术。:-)
    • 这是一个很好的观察,SQL 知道元数据的精度和规模。不确定第 3 个字节是什么(16 个字节用于 4 个 int32s,1 个用于符号,1 个精度,1 个比例,1 个用于?也许是 4 字节对齐)
    • 实现示例可以看Hive的Decimal128
    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2017-06-28
    相关资源
    最近更新 更多