C # Преобразование double с точностью до 20 цифр в string и обратно
Вопрос
В C#.У меня есть double (который я извлек из базы данных) с точностью до 20 цифр.В Visual Studio (используя QuickWatch) я вижу, что значение double равно = 0.00034101243963859839.
Я хочу отобразить это значение в текстовом поле, а затем сделать так, чтобы оно было тем же значением, когда я выну его и преобразоваю обратно в double.Но я всегда теряю последние две цифры
Я пробовал следующее:
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
}
Есть ли какой-нибудь способ сохранить точность этих последних двух цифр??
Решение
Используйте " R " строка числового формата :
double d = 0.00034101243963859839;
string s = d.ToString("R");
//...
double d2 = double.Parse(s);
if(d == d2)
{
//-- Success
}
R
расшифровывается как «туда-обратно». Из связанного документа:
Этот формат поддерживается только для типов Single и Double. Спецификатор туда-обратно гарантирует, что числовое значение, преобразованное в строку, будет проанализировано обратно в то же числовое значение.
Кроме того, я подозреваю, что нет способа сохранить эти последние две цифры. Доступна только такая большая точность, и я сомневаюсь, что они вообще вошли в d
. Но вы можете убедиться, что ваша строка, по крайней мере, правильно считывает то, что у вас есть.
Если вам действительно нужна дополнительная точность, вместо этого вы можете попробовать использовать decimal
.
Другие советы
Нет.Помимо того факта, что double является двоичным и, следовательно, не подходит для десятичных значений, double содержит максимум 15/16 десятичных разрядов (53 бита).десятичное число содержит максимум 28/29 цифр (96 бит), так что использовать его было бы нормально.Если у вас более высокая точность в базе данных, вам нужен собственный класс bignum для C #, посмотрите реализации в stackoverflow.