Подтвердить что ты не робот

С# Преобразование 20-разрядной точности в двойную строку и обратно

В С#. У меня есть двойной (который я извлек из базы данных), который имеет 20-значную точность. В Visual Studio (с помощью QuickWatch) я могу видеть значение double = 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
}

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

4b9b3361

Ответ 1

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

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

R означает "круглый путь". Из связанного документа:

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

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

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

Ответ 2

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