在 C# 中,如何存储和计算显着超过 UInt64 最大值 (18,446,744,073,709,551,615) 的数字?
8 回答
您可以使用 .NET 4.0 测试版吗?如果是这样,您可以使用BigInteger
.
否则,如果您坚持在 28 位以内,您可以使用decimal
- 但请注意,显然这将执行十进制算术,因此您可能需要在不同的地方四舍五入以进行补偿。
通过使用 BigInteger 类;J# 库中有一个(绝对可以从 C# 访问),另一个在 F#(需要测试这个),并且有独立的实现,例如纯 C# 中的这个。
您希望将这些数字用于什么目的?如果您使用非常大的数字进行计算,您还需要精确到最后一位吗?如果没有,您应该考虑改用浮点值。它们可能很大,双精度类型的最大值为 1.79769313486231570E+308,(如果您不习惯科学记数法,则表示 1.79769313486231570 乘以 10000000...0000 - 308 个零)。
对于大多数应用程序来说应该足够大
BigInteger表示任意大的有符号整数。
using System.Numerics;
var a = BigInteger.Parse("91389681247993671255432112000000");
var b = new BigInteger(1790322312);
var c = a * b;
小数的范围更大。
.NET 4.0 中支持 bigInteger,但这还没有结束测试。
有几个用于计算大整数的库,大多数密码库也为此提供了一个类。看到这个免费图书馆。
此外,请检查您是否确实需要一个容量大于 Int64 的变量,并且不会违反 C# 的整数运算。
例如,此代码将产生溢出错误:
Int64 myAnswer = 20000*1024*1024;
乍一看可能是因为结果对于Int64
变量来说太大了,但实际上是因为公式右侧的每个数字都是隐式键入的,Int32
因此为计算结果保留的临时内存空间将是Int32
大小,这就是导致溢出的原因。
结果实际上很容易适应Int64
,它只需要将右侧的值之一转换为Int64
:
Int64 myAnswer = (Int64)20000*1024*1024;
(我很欣赏这不适用于 OP 的情况,但正是这种问题把我带到了这里!)
您可以使用小数。它大于 Int64。
它有 28-29 位有效数字。