20

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

4

8 回答 8

23

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

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

于 2009-08-19T09:38:24.033 回答
21

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

于 2009-08-19T09:39:00.367 回答
14

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

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

于 2009-08-19T11:02:02.290 回答
6

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

using System.Numerics;

var a = BigInteger.Parse("91389681247993671255432112000000");
var b = new BigInteger(1790322312);
var c = a * b;
于 2016-06-05T20:51:05.717 回答
1

小数的范围更大。

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

于 2009-08-19T09:38:21.380 回答
1

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

于 2009-08-19T09:39:13.517 回答
1

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

例如,此代码将产生溢出错误:

Int64 myAnswer = 20000*1024*1024;

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

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

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

此答案中对此进行了更详细的讨论。

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

于 2019-11-23T16:13:11.013 回答
0

您可以使用小数。它大于 Int64。

它有 28-29 位有效数字。

于 2009-08-19T09:41:54.603 回答