你如何处理大于UInt64的数字(C#)

时间:2009-08-19 09:35:32

标签: c# uint64 address-space

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

8 个答案:

答案 0 :(得分:19)

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

否则,如果你坚持在28位数内,你可以使用decimal - 但要注意显然会执行十进制算术,所以你可能需要在各个地方进行舍入来补偿。

答案 1 :(得分:15)

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

答案 2 :(得分:9)

您希望将这些数字用于什么?如果您正在使用非常大的数字进行计算,那么您仍然需要将精度降至最后一位吗? 如果不是,则应考虑使用浮点值。它们可能很大,双重类型的最大值是1.79769313486231570E + 308,(如果您不习惯科学记数法,则表示1.79769313486231570乘以10000000 ... 0000 - 308零)。

对于大多数应用来说,这应该足够大了

答案 3 :(得分:4)

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

using System.Numerics;

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

答案 4 :(得分:1)

十进制有更大的范围。

在.NET 4.0中支持bigInteger,但仍然没有超出beta版。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

它有28-29位有效数字。

答案 7 :(得分:0)

此外,请检查您是否确实需要一个容量比Int64大的变量,并且不会与C#的整数算法相抵触。

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

Int64 myAnswer = 20000*1024*1024;

乍看之下似乎是因为结果对于Int64变量而言太大,但实际上是因为公式右侧的每个数字都隐式地键入为Int32因此为计算结果保留的临时存储空间将为Int32,这就是导致溢出的原因。

结果实际上很容易放入Int64中,只需要将右边的值之一强制转换为Int64

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

这在test pyramid中进行了讨论。

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