C # convertendo 20 precisão de dois dígitos para string e vice-versa
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 ??
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.