2012-10-19 14 views

risposta

5

Dalla documentazione per Double.ToString(IFormatProvider):

Questo esempio è formattato con il formato generale identificatore numerico ("G").

Dalla documentazione per la General Numeric Format Specifier:

-virgola fissa la notazione viene utilizzato se l'esponente che deriverebbe da esprimere il numero in notazione scientifica è superiore a -5 e meno l'identificatore di precisione; in caso contrario, viene utilizzata la notazione scientifica. Il risultato contiene un punto decimale, se necessario, e gli zero finali dopo il punto decimale vengono omessi. Se lo specificatore di precisione è presente e il numero di cifre significative nel risultato supera la precisione specificata, le cifre finali in eccesso vengono rimosse arrotondando.

Tuttavia, se il numero è un decimale e l'identificatore di precisione è omesso, viene sempre utilizzata la notazione a virgola fissa e gli zeri finali vengono mantenuti.

L'identificatore di precisione di default per Double è documentata per essere 15.

Anche se in precedenza nella tabella, è formulato in modo leggermente diverso:

Risultato: il più compatto di uno in virgola fissa o notazione scientifica.

Non ho lavorato capire se quei due sono sempre equivalenti per un valore Double ...

EDIT: Come per il commento di Abel:

Inoltre, non è sempre il più notazione compatta. 0,0001 è più grande di 1E-04, ma il primo è in uscita. I documenti MS non sono completi qui.

Ciò si adatta alla descrizione più dettagliata, ovviamente. (Poiché l'esponente richiesto è maggiore di -5 e inferiore a 15.)

+0

La risposta non include ciò che lo specificatore di precisione è, il che è parte del motivo per cui viene mostrato così com'è. L'impostazione predefinita è '15'. Inoltre, non è sempre la notazione più compatta. '0.0001' è maggiore di' 1E-04', ma il primo è in uscita. I documenti MS non sono completi qui. – Abel

+0

@Abel: includerà entrambi i bit, grazie. –

+0

Non sono d'accordo con il termine "più compatto" e considero la documentazione di msdn come fuorviante in questo senso. Se si prende il doppio x = 13950, il formato G4 produce "1.395E + 04", che è miglia da "più compatto". A mio parere, il formato "G" ha funzionato meglio in C, Fortran ecc. Dove ha prodotto davvero una stringa "più compatta". C# mi obbliga a cercare soluzioni alternative ... –

1

Ho appena provato questo con un ciclo:

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

L'uscita era:

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

Ho provato esperimenti simili, ma ancora non avevo una risposta precisa per il motivo per cui la conversione avviene quando lo fa. – geekchic

5

Dalla documentazione risulta che la forma più compatta per rappresentare il numero sarà scelto.

I.e., quando non si specifica una stringa di formato, default is the "G" format string. Dal specification of the G format string segue:

Risultato: il più compatto di notazione a punto fisso o scientifico.

Il default for the number of digits è 15 con l'identificatore. Ciò significa che un numero rappresentabile come esattamente una determinata rappresentazione binaria (come 0.1 nell'esempio di harriyott) verrà visualizzato come punto fisso, a meno che la notazione esponenziale sia più compatta.

Quando ci sono più cifre, per impostazione predefinita, visualizza tutte queste cifre (fino a 15) e sceglie la notazione esponenziale una volta che è più breve.

aver realizzato tutto questo:

?(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 

E, di 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 

Questo è quello di mostrare ciò che accade dietro le quinte e perché 0.2 è scritto come 0.2, non 0,20000000000000001, che è in realtà è. Per impostazione predefinita, vengono visualizzate 15 cifre significative. Quando ci sono più cifre (e ci sono sempre, ad eccezione di alcuni numeri speciali), queste sono arrotondate nel modo normale. Dopo l'arrotondamento, gli zeri ridondanti vengono rimossi.

Si noti che una doppia ha una precisione di 15 o 16 cifre, a seconda del numero. Quindi, mostrando 15 cifre, quello che vedi è un numero correttamente arrotondato e sempre una rappresentazione completa e la rappresentazione più breve del doppio.

4

utilizza il formattatore "G" (per "Generale"), che è specificato di utilizzare "il più compatto di uno a virgola fissa o notazione scientifica" http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Quindi dal momento che il punto fisso-0.00001 è più caratteri di 1E-05 favorirà la notazione scientifica. Suppongo che se sono di uguale lunghezza, favorisce il punto fisso.

+0

'0.0001' ha più caratteri quindi' 1E-04', ma è preferito ...;) – Abel

Problemi correlati