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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top