2009-03-04 12 views
25

En C#. Tengo un doble (que he extraído de una base de datos) que tiene una precisión de 20 dígitos. En Visual Studio (usando QuickWatch) puedo ver que el valor del doble es = 0,00034101243963859839.C# Conversión de precisión de 20 dígitos de doble a cadena y viceversa

Quiero mostrar este valor en un cuadro de texto y luego tener el mismo valor cuando lo saque y lo vuelva a convertir en un doble. Pero siempre pierdo los dos últimos dígitos

He intentado lo siguiente:

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(); 

En estos casos:

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

Quiero ser capaz de hacer lo siguiente:

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

¿Hay alguna manera de mantener esos dos últimos dígitos de precisión?

Respuesta

44

Utilice la "R" numeric format string:

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

Los R es sinónimo de "ida y vuelta". Desde el documento vinculado:

Este formato solo se admite para los tipos Single y Double. El especificador de ida y vuelta garantiza que un valor numérico convertido a una cadena se analizará de nuevo en el mismo valor numérico.

Como un lado, sospecho que no hay forma de mantener esos dos últimos dígitos. Solo hay mucha precisión disponible, y dudo que alguna vez lleguen al d en primer lugar. Pero puede asegurarse de que su cadena al menos lee lo que tiene correctamente.

Si realmente necesita la precisión adicional, puede intentar usar un decimal en su lugar.

+1

Perfecto. ¡Gracias! –

+0

Me has ayudado aquí http://stackoverflow.com/q/18553687/114029. ¡Gracias! –

+0

"Como un lado, sospecho que no hay forma de mantener esos dos últimos dígitos". - Pero, ¿cómo puede Visual Studio "ver" esos dos dígitos? –

1

No. Además del hecho de que el doble es binario y, por lo tanto, no es bueno para los valores decimales, dobles tienen un máximo de 15/16 dígitos decimales (53 bits). decimal tiene un máximo de 28/29 dígitos (96 bit), por lo que estaría bien usarlo. Si tiene una mayor precisión en la base de datos, necesita una clase bignum propia para C#, busque en stackoverflow para las implementaciones.

Cuestiones relacionadas