1

.NET 4 System.Numerics.BigInteger構造を使用していますが、ドキュメントとは異なる結果が得られます。

BigInteger.ToString()メソッドのドキュメントには次のように書かれています。

ToString()メソッドは、小数点以下50桁の精度をサポートします。つまり、BigInteger値が50桁を超える場合、出力文字列には最上位50桁のみが保持されます。他のすべての数字はゼロに置き換えられます。

10進数の60桁を取り、BigIntegerそれをに変換するコードがありstringます。有効数字60桁stringは、有効数字を失いませんでした。

const string vString = "123456789012345678901234567890123456789012345678901234567890";
Assert.AreEqual(60, vString.Length);
BigInteger v = BigInteger.Parse(vString);
Assert.AreEqual(60, v.ToString().Length);
Assert.AreEqual('9', v.ToString()[58]);
Assert.AreEqual('1', v.ToString()[0]);
Assert.AreEqual(vString, v.ToString());
Assert.AreEqual(vString, v.ToString("G"));

すべてのアサートが合格します。

ドキュメントの引用部分は正確にはどういう意味ですか?

4

1 に答える 1

3

ここでのドキュメントは少し不明確です。この制限は、文字列をフォーマットする場合にのみ適用されます。次に例を示します。

v.ToString("0"); "123456789012345678901234567890123456789012345678900000000000"
v.ToString("n0"); "123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,900,000,000,000"

例外は"R"、それをとしてフォーマットすることです。これにより、元のラウンドトリップ値が得られます。

v.ToString("R"); "123456789012345678901234567890123456789012345678901234567891"
于 2010-06-06T12:54:53.503 に答える