C # Conversión de 20 dígitos de precisión doble a cadena y viceversa
Pregunta
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.
Quiero mostrar este valor en un cuadro de texto y luego hacer que sea el mismo valor cuando lo saque y vuelva a convertirlo 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 poder hacer lo siguiente:
double d = 0.00034101243963859839;
string s = d.ToString();
//...
double d2 = double.Parse(s);
if(d == d2)
{
//-- Success
}
¿Hay alguna forma de mantener esos dos últimos dígitos de precisión?
Solución
Utilice la " R " cadena de formato numérico :
double d = 0.00034101243963859839;
string s = d.ToString("R");
//...
double d2 = double.Parse(s);
if(d == d2)
{
//-- Success
}
El R
significa "ida y vuelta". Del documento vinculado:
Este formato solo es compatible con los tipos Single y Double. El especificador de ida y vuelta garantiza que un valor numérico convertido a una cadena se analizará nuevamente en el mismo valor numérico.
Como comentario aparte, sospecho que no hay forma de mantener esos dos últimos dígitos. Solo hay mucha precisión disponible, y dudo que alguna vez lleguen a d
en primer lugar. Pero puede asegurarse de que su cadena lea al menos lo que tiene correctamente.
Si realmente necesita la precisión adicional, puede intentar usar un decimal
en su lugar.
Otros consejos
No. Además del hecho de que double es binario y, por lo tanto, no es bueno para valores decimales, los dobles tienen un máximo de 15/16 dígitos decimales (53 bits). decimal tiene un máximo de 28/29 dígitos (96 bits), por lo que estaría bien usarlo. Si tiene mayores precisiones en la base de datos, necesita una clase bignum propia para C #, busque implementaciones en stackoverflow.