C# では、UInt64 の最大値 (18,446,744,073,709,551,615) を大幅に超える数値を格納して計算するにはどうすればよいですか?
8 に答える
.NET 4.0 ベータ版は使用できますか? その場合、使用できますBigInteger
。
それ以外の場合、28 桁以内に固執している場合は使用できますがdecimal
、明らかに小数演算を実行することに注意してください。そのため、補正するためにさまざまな場所で丸める必要がある場合があります。
BigInteger クラスを使用する。J# ライブラリに 1 つ (間違いなく C# からアクセス可能)、F# にもう 1 つ (これをテストする必要があります)、純粋な C# にはこのような独立した実装があります。
これらの数字を何に使いたいですか?非常に大きな数で計算を行っている場合でも、最後の桁までの精度が必要ですか? そうでない場合は、代わりに浮動小数点値を使用することを検討してください。double 型の最大値は 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;
Decimal の方が範囲が広いです。
.NET 4.0 では bigInteger がサポートされていますが、まだベータ版ではありません。
大きな整数を計算するためのライブラリがいくつかあります。暗号化ライブラリのほとんどは、そのためのクラスも提供しています。無料のライブラリについては、こちらを参照してください。
また、Int64 よりも大きな容量を持つ変数が本当に必要であり、C# の整数演算に違反していないことを確認してください。
たとえば、次のコードではオーバーフロー エラーが発生します。
Int64 myAnswer = 20000*1024*1024;
一見、Int64
変数に対して結果が大きすぎるためと思われるかもしれませんが、実際には、式の右側の各数値が暗黙的に型指定されてInt32
いるため、計算結果用に予約された一時メモリ領域がサイズであり、それがInt32
オーバーフローの原因です。
結果は実際には簡単に に収まりInt64
ます。右側の値の 1 つを にキャストする必要があるだけですInt64
。
Int64 myAnswer = (Int64)20000*1024*1024;
これについては、この回答で詳しく説明しています。
(これはOPの場合には当てはまらないことを感謝しますが、私をここに連れてきたのはこの種の問題でした!)
10進数を使用できます。Int64よりも大きいです。
有効数字は28〜29桁です。