8

BigInteger今日まで、パラメーターなしの (オーバーライドされた) インスタンス メソッドを介してa を出力するBigInteger.ToString()と、返される文字列には、「大きな」整数の完全かつ正確な 10 進数表現が含まれると (暗黙のうちに) 想定していました。

しかし、私が読んだMSDNのドキュメントページで:

「ほとんどの場合、ToStringメソッドは 50 桁の精度をサポートします。つまり、BigInteger値が 50 桁を超える場合、最上位 50 桁のみが出力文字列に保持されます。他のすべての桁はゼロに置き換えられます。ただし、 , BigIntegerは数値をラウンドトリップするための"R"標準書式指定子をサポートしています. "R "書式指定文字列を使用してToString(String)メソッドによって返される文字列は、 BigInteger値全体を保持し、 ParseまたはTryParseメソッドを使用して、データを失うことなく元の値を復元します"._

myBigInt.ToString()ただし、 と異なる例を見つけることができませんでしたmyBigInt.ToString("R")。上記のページの備考の例は、主張されているように、私のバージョンのフレームワーク (.NET 4.0 SP1) では例を提供していません。(また"G"、 と"R"は同等のようですBigInteger。)

ToString()パラメータレスが整数の完全な10進展開を与えると仮定しても安全ですか? それらはフレームワークの動作を変更しましたか、それとも上記のサンプル コードは常に間違っていましたか?

注: SOは、これを書いた後、この「同様の質問」2984184を示していますが、2984184の回答ではゼロパラメーターの仕組みが実際には明確にされていないため、まだ質問を送信していますToString()

自分で編集:

ToString(String)私の質問が (主に) 過負荷に関するものである場合、MSDN で過負荷をリンクするのは少し無頓着でしたToString()。そのため、50 桁の制限についても言及しているが、50 桁を超える例を提供していないMSDNBigInteger.ToString()も参照してください。

4

3 に答える 3

5

.NET 4.0 フレームワークを逆コンパイルすると、次の一連の呼び出しが得られます。

BigInteger.ToString
BigNumber.FormatBigInteger( ... format:= null ...)
BigNumber.ParseFormatSpecifier(format ...)

私たちが持っている

  if (string.IsNullOrEmpty(format))
    return 'R';

したがって、この実装ToString()は、 は と同等であることがわかりToString("R")ます。しかし、@PaulPhillipsが指摘したように、ドキュメントが(少し混乱して)これの信頼性を明示的に否認していることを考えると、最も安全な(そしていずれにせよ最も自己文書化された)ことは、「R」を使用することです。完全な忠実度が必要です。

于 2012-07-05T14:10:47.560 に答える
3

私はそれが安全な仮定だとは思いません。

彼らはそれをしないと明示的に文書化しているので、この振る舞いに頼るのは悪い考えのようです. 実際同じである場合、文書化されておらず、理論的にはいつでも変更される可能性があります (これはありそうにありませんが)。

于 2012-07-05T13:58:57.470 に答える
0

ソースコードを見ると、ToString()メソッドは単に呼び出します:

BigNumber.FormatBigInteger(this, (string)null, NumberFormatInfo.CurrentInfo);

そこから、内部BigNumber.FormatBigInteger(BigInteger value, string format, NumberFormatInfo info)メソッドには次のロジックがあります。

int digits = 0;
char format1 = BigNumber.ParseFormatSpecifier(format, out digits);

ここでBigNumber.ParseFormatSpecifier(string format, out int digits)メソッドを見てみると、NULL 文字列が渡されたため、桁数 ( ) が -1の文字'R'が返されるだけであることがわかります。digits一方、実際に文字列形式で渡した場合は、桁数も指定できます。たとえば、「R25」とすると、桁数として 25 が解析されます。

これはソースコードを見てわかったことです。

于 2012-07-05T14:19:31.547 に答える