Domanda

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

Voglio visualizzare questo valore in una casella di testo e quindi avere lo stesso valore quando lo estraggo e lo converto in doppio. Ma perdo sempre le ultime due cifre

Ho provato quanto segue:

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 fare quanto segue:

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

Esiste un modo per mantenere le ultime due cifre di precisione ??

È stato utile?

Soluzione

Usa il " R " stringa in formato numerico :

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

Il R sta per "quotazione andata e ritorno". Dal documento collegato:

  

Questo formato è supportato solo per i tipi Single e Double. L'identificatore di andata e ritorno garantisce che un valore numerico convertito in una stringa verrà analizzato nuovamente nello stesso valore numerico.

Sospetto, a parte, sospetto che non ci sia modo di conservare quelle ultime due cifre. C'è solo tanta precisione disponibile, e dubito che siano mai arrivati ??a d in primo luogo. Ma puoi assicurarti che la tua stringa rilevi almeno ciò che hai correttamente.

Se hai davvero bisogno della precisione aggiuntiva, potresti provare a usare un decimale .

Altri suggerimenti

No. Oltre al fatto che double è binario e quindi non buono per i valori decimali, i doppi hanno un massimo di 15/16 cifre decimali (53 bit). il decimale ha un massimo di 28/29 cifre (96 bit), quindi sarebbe bene usarlo. Se hai precisioni più elevate nel database, hai bisogno di una propria classe bignum per C #, cerca nello stackoverflow le implementazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top