2009-03-04 10 views
25

In C#. Ho un doppio (che ho estratto da un database) che ha una precisione di 20 cifre. In Visual Studio (usando QuickWatch) posso vedere il valore del doppio essere = 0.00034101243963859839.C# Conversione di precisione a 20 cifre da doppio a stringa e viceversa

Voglio visualizzare questo valore in una casella di testo e poi avere lo stesso valore quando lo prendo e convertirlo in un doppio. Ma ho sempre perso le ultime due cifre

ho provato la seguente:

double d = 0.00034101243963859839; 
string s = d.ToString(); 
string s2 = d.ToString("F20"); 
string s3 = d.ToString("0.00000000000000000000"); -- 20 0's 
string s4 = (d*100d).ToString(); 

In questi casi:

s = 0.000341012439638598 
s2 = 0.00034101243963859800 
s3 = 0.00034101243963859800 
s4 = 0.0341012439638598

voglio essere in grado di effettuare le seguenti operazioni:

double d = 0.00034101243963859839; 
string s = d.ToString(); 
//... 
double d2 = double.Parse(s); 
if(d == d2) 
{ 
    //-- Success 
} 

C'è un modo per mantenere quelle ultime due cifre di precisione ??

risposta

44

Utilizzare la "R" numeric format string:

double d = 0.00034101243963859839; 
string s = d.ToString("R"); 
//... 
double d2 = double.Parse(s); 
if(d == d2) 
{ 
    //-- Success 
} 

I R l'acronimo di "andata e ritorno". Dal documento collegato:

Questo formato è supportato solo per i tipi Single e Double. Lo specificatore round-trip garantisce che un valore numerico convertito in una stringa venga analizzato nello stesso valore numerico.

Per inciso, ho il sospetto che non ci sia modo di mantenere quelle ultime due cifre. C'è solo tanta precisione disponibile, e dubito che abbiano mai fatto in d in primo luogo. Ma puoi assicurarti che la tua stringa rileggi almeno ciò che hai correttamente.

Se è davvero necessaria la precisione aggiuntiva, è possibile provare a utilizzare un decimal.

+1

Perfetto. Grazie! –

+0

Mi hai aiutato qui http://stackoverflow.com/q/18553687/114029. Grazie! –

+0

"Per inciso, ho il sospetto che non ci sia modo di mantenere quelle ultime due cifre." - Ma come può Visual Studio "vedere" quelle due cifre? –

1

No. Oltre al fatto che il doppio è binario e quindi non è valido per i valori decimali, i numeri hanno un massimo di 15/16 cifre decimali (53 bit). decimale ha un massimo di 28/29 cifre (96 bit), quindi sarebbe giusto usarlo. Se si dispone di precisioni più elevate nel database, è necessaria una propria classe bignum per C#, cercare in stackoverflow per le implementazioni.