2012-10-19 8 views

Antwort

5

Aus der Dokumentation für Double.ToString(IFormatProvider):

Diese Instanz wird mit dem allgemeinen numerischen Formatbezeichner ("G") formatiert.

Von der Dokumentation für die General Numeric Format Specifier:

Festpunktnotation verwendet, wenn der Exponent, der von Ausdrücken der Zahl in wissenschaftlicher Notation größer als -5 und kleiner als die Genauigkeitsbezeichner führen würde; Andernfalls wird wissenschaftliche Notation verwendet. Das Ergebnis enthält, falls erforderlich, einen Dezimalpunkt, und nach dem Dezimalpunkt nachgestellte Nullen werden weggelassen. Wenn die Genauigkeitsbezeichner vorhanden ist und die Anzahl der signifikanten Stellen im Ergebnis ist, überschreitet die Präzision, die überzähligen hinteren Ziffern werden durch Runden entfernt.

Wenn jedoch die Zahl eine Dezimalzahl und die Präzision Spezifizierer weggelassen wird, Festkommaschreibweise wird immer verwendet, und nachgestellte Nullen erhalten sind.

Der Standard Genauigkeitsbezeichner für Double dokumentiert 15.

zu sein, obwohl früher in der Tabelle, ist es etwas anders formuliert ist:

Ergebnis: Die kompakteste entweder Festpunkt oder wissenschaftliche Schreibweise.

ich aus nicht gearbeitet haben, ob die beiden für einen Wert Double immer gleichwertig sind ...

EDIT: Wie pro Abels Kommentar:

Auch ist es nicht immer die kompakte Schreibweise. 0,0001 ist größer als 1E-04, aber der erste wird ausgegeben. Die MS-Dokumente sind hier nicht vollständig.

Das passt natürlich zu der detaillierteren Beschreibung. (Da der Exponent erforderlich ist größer als -5 und weniger als 15.)

+0

Sie beantworten nicht enthalten, was die Genauigkeitsbezeichner ist, welcher Teil ist, warum es die Art und Weise dargestellt ist. Der Standardwert ist "15". Außerdem ist es nicht immer die kompakteste Notation. '0,0001' ist größer als' 1E-04', aber der erste wird ausgegeben. Die MS-Dokumente sind hier nicht vollständig. – Abel

+0

@Abel: Wird beide Bits enthalten, danke. –

+0

Ich bin nicht einverstanden mit dem Begriff „kompakteste“ und Msdn Dokumentation als irreführend in dieser Hinsicht überlegen. Wenn Sie doppelt nehmen x = 13950, dann erzeugt G4-Format „1.395E + 04“, die Meilen entfernt, „kompakteste“ ist. Meiner Meinung nach funktionierte das "G" -Format besser in C, Fortran usw., wo es wirklich "kompakteste" Saite produzierte. C# zwingt mich, nach Workarounds zu suchen ... –

1

Ich habe das gerade versucht, mit einer Schleife:

double a = 1; 
for (var i = 1; i < 10; i++) 
{ 
    a = a/10; 
    Console.WriteLine(a.ToString(CultureInfo.InvariantCulture)); 
} 

Der Ausgang war:

0.1 
0.01 
0.001 
0.0001 
1E-05 
1E-06 
1E-07 
1E-08 
1E-09 
+1

ich ähnliche Experimente ausprobiert, aber immer noch nicht über eine genaue Antwort, warum die Umwandlung geschieht, wenn es funktioniert. – geekchic

5

Aus der Dokumentation folgt daraus, dass die kompakteste Form die Nummer vertreten gewählt werden.

Das heißt, wenn Sie keine Formatzeichenfolge angeben, die default is the "G" format string. Aus folgt:

Ergebnis: Die kompakteste von entweder Festkomma oder wissenschaftliche Notation.

Die default for the number of digits ist 15 mit dem Spezifizierer. Das heißt, dass eine Zahl, die als genau einer bestimmten Binärdarstellung (wie zB 0.1 im Beispiel von Harriyott) darstellbar ist, als Fixpunkt angezeigt wird, sofern die Exponentialschreibweise nicht kompakter ist.

Wenn mehr Ziffern vorhanden sind, werden standardmäßig alle diese Ziffern angezeigt (bis zu 15) und die Exponentialschreibweise einmal kürzer gewählt.

Putting dies zusammen:

?(1.0/7.0).ToString() 
"0,142857142857143"  // 15 digits 
?(10000000000.0/7.0).ToString() 
"1428571428,57143"  // 15 significant digits, E-notation not shorter 
?(100000000000000000.0/7.0).ToString() 
"1,42857142857143E+16" // 15 sign. digits, above range for non-E-notation (15) 
?(0.001/7.0).ToString() 
"0,000142857142857143" // non E-notation is shorter 
?(0.0001/7.0).ToString() 
"1,42857142857143E-05" // E-notation shorter 

Und von Interesse:

?(1.0/2.0).ToString() 
"0,5"     // exact representation 
?(1.0/5.0).ToString() 
"0,2"     // rounded, zeroes removed 
?(1.0/2.0).ToString("G20") 
"0,5"     // exact representation 
?(1.0/5.0).ToString("G20") 
"0,20000000000000001" // unrounded 

Dies zu zeigen, ist das, was hinter den Kulissen passiert, und warum ist 0.2 als 0.2 geschrieben, nicht 0,20000000000000001, was eigentlich ist ist. Standardmäßig werden 15 signifikante Ziffern angezeigt. Wenn es mehr Ziffern gibt (und es gibt immer, außer für bestimmte Sondernummern), sind diese auf die normale Art und Weise gerundet. Nach dem Runden werden redundante Nullen entfernt.

Beachten Sie, dass ein Double eine Genauigkeit von 15 oder 16 Ziffern hat, abhängig von der Nummer. Wenn Sie also 15 Ziffern anzeigen, sehen Sie eine korrekt abgerundete Zahl und immer eine vollständige Darstellung und die kürzeste Darstellung der doppelten.

4

Es nutzt die Formatierer „G“ (für „General“), die „die kompakteste entweder Festpunkt oder wissenschaftlicher Notation“ verwenden angegeben http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

So, da der Festpunkt 0.00001 mehr Zeichen als 1E-05 wird es die wissenschaftliche Notation bevorzugen. Ich nehme an, wenn sie von gleicher Länge sind, bevorzugt sie Fixpunkt.

+0

'0.0001' mehr Zeichen hat dann' 1E-04', aber bevorzugt wird ...;) – Abel

Verwandte Themen