Gibt die von BigInteger.ToString () zurückgegebene Zeichenfolge in .NET die volle Genauigkeit von BigInteger wieder?

8

Bis heute nahm ich (implizit) an, dass, wenn ich eine BigInteger über die parameterlose (überschriebene) Instanzmethode BigInteger.ToString() austrage, die Rückgabekette die vollständige und genaue Dezimaldarstellung meiner "großen" ganzen Zahl enthalten würde.

Aber auf der MSDN-Dokumentseite habe ich gelesen:

  

"In den meisten Fällen unterstützt die ToString -Methode 50 Dezimalstellen der Genauigkeit. Wenn der Wert BigInteger mehr als 50 Ziffern hat, sind es nur die 50 höchstwertigen Die Ziffern werden in der Ausgabezeichenfolge beibehalten, alle anderen Ziffern werden durch Nullen ersetzt. BigInteger unterstützt jedoch den "R" -Standardformatbezeichner, der für die numerische Rundung vorgesehen ist Die von der ToString (String) -Methode mit der "R" -Formatzeichenfolge zurückgegebene Zeichenfolge behält den gesamten BigInteger -Wert bei und kann dann analysiert werden mit der Methode Parse oder TryParse , um den ursprünglichen Wert ohne Datenverlust wiederherzustellen. "._

Ich konnte jedoch kein Beispiel finden, in dem sich myBigInt.ToString() von myBigInt.ToString("R") unterscheidet. Das Beispiel "Bemerkungen" von der oben genannten Seite bietet in meiner Version des Frameworks (.NET 4.0 SP1) kein Beispiel. (Auch "G" und "R" scheinen für BigInteger gleichwertig zu sein.)

Kann man davon ausgehen, dass das parameterlose ToString() die ganze dezimale Erweiterung der Ganzzahl liefert? Haben sie das Framework-Verhalten geändert oder ist der oben erwähnte Beispielcode immer falsch?

>

Hinweis: SO zeigt mir diese "ähnliche Frage" 2984184 nachdem ich diese geschrieben habe, aber ich gebe immer noch meine Frage ein, weil die Antwort von 2984184 nicht wirklich klarstellt, wie der Zero-Parameter ToString() funktioniert.

EDIT MY SELF:

Es war ein wenig inkonsequent von mir, die ToString(String) overload auf MSDN zu verlinken, wenn meine Frage (hauptsächlich) die ToString() overload betrifft. Sehen Sie sich auch MSDN auf BigInteger.ToString() an, in der auch die 50-stellige Grenze erwähnt wird, die jedoch kein Beispiel liefert mit mehr als 50 Ziffern.

    
Jeppe Stig Nielsen 05.07.2012, 13:49
quelle

3 Antworten

4

Das Dekompilieren des .NET 4.0-Frameworks ergibt diese Kette von Aufrufen:

%Vor%

in dem wir

haben %Vor%

Es ist also ersichtlich, dass in dieser Implementierung ToString() entspricht ToString("R") . Aber, wie von @PaulPhillips darauf hingewiesen, dass die Dokumente (leicht verwirrt) ausdrücklich die Zuverlässigkeit dieser Aussage ausschließen, würde ich sagen Das sicherste (und auf jeden Fall das selbstdokumentierendste) ist Verwenden Sie "R", wenn Sie vollständige Wiedergabetreue benötigen .

    
AakashM 05.07.2012, 14:10
quelle
3

Ich glaube nicht, dass es eine sichere Annahme ist.

Da sie dies ausdrücklich als nicht dokumentiert haben, scheint es eine schlechte Idee zu sein, sich auf dieses Verhalten zu verlassen. Wenn es eigentlich ist das gleiche, dann ist es undokumentiert und könnte sich theoretisch jederzeit ändern (obwohl das unwahrscheinlich erscheint).

    
Paul Phillips 05.07.2012 13:58
quelle
0

Beim Betrachten des Quellcodes ruft die Methode ToString() einfach auf:

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

Von dort hat die interne Methode BigNumber.FormatBigInteger(BigInteger value, string format, NumberFormatInfo info) die folgende Logik:

%Vor%

Nun schauen wir uns die BigNumber.ParseFormatSpecifier(string format, out int digits) -Methode an und entdecken, dass sie, weil sie in einer Null-Zeichenfolge übergeben wurde, einfach das Zeichen 'R' zurückgibt, wobei die Anzahl der Ziffern ( digits ) gleich ist bis 1. Wenn Sie tatsächlich ein Zeichenfolgenformat übergeben haben, können Sie auch die Anzahl der Ziffern angeben, zum Beispiel ... 'R25' und es wird 25 als Anzahl der Ziffern analysiert.

Das habe ich bei der Betrachtung des Quellcodes verstanden.

    
m-y 05.07.2012 14:19
quelle

Tags und Links