Pergunta

Em C #. Eu tenho um duplo (que eu tenho extraído de um banco de dados), que tem 20 precisão dígito. No Visual Studio (usando QuickWatch) Eu posso ver o valor do duplo ser = ,00034101243963859839.

Eu quero mostrar esse valor em uma caixa de texto e, em seguida, tê-lo ser o mesmo valor quando eu tirá-lo e convertê-lo de volta para um duplo. Mas eu sempre perder os dois últimos dígitos

Eu tentei o seguinte:

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

Nestes casos:

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

Eu quero ser capaz de fazer o seguinte:

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

Existe alguma maneira para manter os dois últimos dígitos de precisão ??

Foi útil?

Solução

Use o "R" formato numérico corda :

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

O R significa "round-trip". A partir do documento vinculado:

Este formato é suportado apenas para os tipos individuais e duplos. As garantias de ida e volta especificador que um valor numérico convertido para uma string estará de volta analisado no mesmo valor numérico.

Como um aparte, eu suspeito que não há nenhuma maneira para manter os dois últimos dígitos. Há apenas tanta precisão disponíveis, e eu duvido que eles nunca fazê-lo em d em primeiro lugar. Mas você pode ter certeza de sua seqüência de pelo menos lê de volta o que você tem corretamente.

Se você realmente precisa a precisão adicional, você pode tentar usar um decimal vez.

Outras dicas

No. Além do fato de que a dupla é binário e, portanto, não é bom para valores decimais, duplos têm um máximo de 15/16 dígitos decimais (53 bits). decimal tem um máximo de dígitos 28/29 (96 bits), de modo que seria ok para usá-lo. Se você tem precisões mais elevadas no banco de dados, você precisa de uma classe própria bignum para C #, olhar em stackoverflow para implementações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top