在C#中,如何使用大大超过UInt64最大值(18,446,744,073,709,551,615)的数字进行存储和计算?
答案 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的情况,但正是这种问题将我带到了这里!)