C # Преобразование 20-значной точности дважды в строку и обратно - PullRequest
28 голосов
/ 04 марта 2009

В C #. У меня есть двойной (который я извлек из базы данных), который имеет точность 20 цифр. В Visual Studio (с использованием QuickWatch) я вижу значение двойного = 0,00034101243963859839.

Я хочу отобразить это значение в текстовом поле, а затем иметь то же значение, когда вынимаю его и преобразовываю обратно в двойное число Но я всегда теряю последние две цифры

Я пробовал следующее:

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

В этих случаях:

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

Я хочу иметь возможность сделать следующее:

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

Есть ли способ сохранить последние две цифры точности ??

Ответы [ 2 ]

47 голосов
/ 04 марта 2009

Используйте "R" строка числового формата :

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

R означает «туда-обратно». Из связанного документа:

Этот формат поддерживается только для типов Single и Double. Спецификатор туда-обратно гарантирует, что числовое значение, преобразованное в строку, будет проанализировано обратно в то же числовое значение.

Кроме того, я подозреваю, что нет способа сохранить эти последние две цифры. Доступна только такая большая точность, и я сомневаюсь, что они вообще вошли в d. Но вы можете убедиться, что ваша строка, по крайней мере, правильно читает то, что у вас есть.

Если вам действительно нужна дополнительная точность, вместо этого вы можете попробовать decimal.

1 голос
/ 08 декабря 2009

Нет. Помимо того, что double является двоичным и, следовательно, не подходит для десятичных значений, двойной тип имеет максимум 15/16 десятичных цифр (53 бита). десятичное число имеет максимум 28/29 цифр (96 бит), поэтому было бы хорошо использовать его. Если у вас более высокая точность в базе данных, вам нужен собственный класс bignum для C #, ищите реализации в stackoverflow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...