2009-03-04 4 views
25

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

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

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

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 
} 

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

ответ

44

Используйте "R" numeric format string:

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

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

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

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

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

+1

Perfect. Спасибо! – 2009-03-04 17:20:22

+0

Вы помогли мне здесь http://stackoverflow.com/q/18553687/114029. Благодаря! –

+0

«Как ни в стороне, я подозреваю, что невозможно сохранить эти последние две цифры». - Но как Visual Studio может «видеть» эти две цифры? –

1

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