【问题标题】:How do you deal with numbers larger than UInt64 (C#)你如何处理大于 UInt64 的数字(C#)
【发布时间】:2016-12-14 06:26:46
【问题描述】:

在 C# 中,如何存储和计算明显超过 UInt64 最大值 (18,446,744,073,709,551,615) 的数字?

【问题讨论】:

    标签: c# uint64 address-space


    【解决方案1】:

    十进制的范围更大。

    在 .NET 4.0 中支持 bigInteger,但这还没有结束测试。

    【讨论】:

      【解决方案2】:

      您可以使用 .NET 4.0 测试版吗?如果是这样,您可以使用BigInteger

      否则,如果您坚持在 28 位以内,您可以使用 decimal - 但请注意,显然这将执行十进制算术,因此您可能需要在不同的地方四舍五入以进行补偿。

      【讨论】:

      • 如果有人遇到命名空间问题,它在 System.Numerics 下;
      【解决方案3】:

      通过使用 BigInteger 类; J# 库中有一个(绝对可以从 C# 访问),另一个在 F#(需要测试这个),并且在纯 C# 中有独立的实现 such as this one

      【讨论】:

      • 另外值得注意的是——DLR 中还有另一个实现支持 Python 和 Ruby 不定精度整数,但我还没有查看该类的公共 API 是什么。
      【解决方案4】:

      有几个用于计算大整数的库,大多数密码库也为此提供了一个类。免费图书馆请参阅this

      【讨论】:

        【解决方案5】:

        您可以使用decimal。它大于 Int64。

        它有 28-29 位有效数字。

        【讨论】:

          【解决方案6】:

          您希望将这些数字用于什么目的?如果您使用非常大的数字进行计算,您还需要精确到最后一位吗? 如果没有,您应该考虑改用浮点值。它们可能很大,双精度类型的最大值为 1.79769313486231570E+308,(如果您不习惯科学记数法,则表示 1.79769313486231570 乘以 10000000...0000 - 308 个零)。

          对于大多数应用程序来说应该足够大

          【讨论】:

          • 令人惊讶的是没有人提到这一点,因为 OP 没有指定整数。
          • 皮特提到了这一点。
          • 当然你可以使用 double 来存储大数值。但是有些计算不能与其他类型一样工作双倍。检查:stackoverflow.com/a/906574/5771568
          【解决方案7】:

          BigInteger 表示任意大的有符号整数。

          using System.Numerics;
          
          var a = BigInteger.Parse("91389681247993671255432112000000");
          var b = new BigInteger(1790322312);
          var c = a * b;
          

          【讨论】:

            【解决方案8】:

            另外,请检查您是否确实需要容量大于 Int64 的变量,并且不会违反 C# 的整数运算。

            例如,这段代码会产生溢出错误:

            Int64 myAnswer = 20000*1024*1024;
            

            乍一看可能是因为结果对于Int64变量来说太大了,但实际上是因为公式右侧的每个数字都隐式键入为Int32所以临时内存为计算结果保留的空间将是Int32 大小,这就是导致溢出的原因。

            结果实际上很容易适合Int64,它只需要将右侧的值之一转换为Int64

            Int64 myAnswer = (Int64)20000*1024*1024;
            

            这在more detail in this answer 中进行了讨论。

            (我很欣赏这不适用于 OP 的情况,但正是这种问题把我带到了这里!)

            【讨论】:

            • 更好Int64 myAnswer = 20000L * 1024L * 1024L;
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-06-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-12
            • 1970-01-01
            相关资源
            最近更新 更多