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

Есть ли способ форматировать двойной символ С#?

Есть ли способ получить строку, показывающую точное значение double, со всеми десятичными знаками, необходимыми для представления его точного значения в базе 10?

Например (через Джон Скит и Тони Пони), когда вы печатаете

double d = 0.3;

фактическое значение d равно точно

0.299999999999999988897769753748434595763683319091796875

Каждое двоичное значение с плавающей запятой (игнорируя такие вещи, как бесконечность и NaN) будет разрешено с конечным десятичным значением. Таким образом, с достаточным количеством цифр в выводе (в этом случае 55), вы всегда можете взять все, что находится в double, и показать его точное значение в десятичном формате. И, будучи способным показать людей, точное значение было бы действительно полезно, когда возникла необходимость объяснять странности арифметики с плавающей запятой. Но есть ли способ сделать это в С#?

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

  • d.ToString("n55") выводит 0.3, за которым следует 54 нулей - он делает свой обычный "круглый" для того, что вы, вероятно, хотите увидеть ", а затем накладывает больше нулей в конце. То же самое, если я использую строку пользовательского формата 0.00000...
  • d.ToString("r") дает вам значение с достаточной точностью, что если вы проанализируете его, вы получите тот же шаблон бит, с которого вы начали, но в этом случае он просто выводит 0.3. (Это было бы более полезно, если бы я имел дело с результатом вычисления, а не с константой.)
  • d.ToString("e55") выводит 2.9999999999999999000000000000000000000000000000000000000e-001 - некоторые из точности, но не все, как я и ищу.

Есть ли какая-либо строка формата, которую я пропустил, или какая-либо другая библиотечная функция, или пакет NuGet или другая библиотека, которая способна преобразовать double в строку с полной точностью?

4b9b3361

Ответ 1

Вы можете попробовать использовать # заполнители, если хотите подавить конечные нули и избегать научной нотации. Хотя вам нужно много их для очень маленьких чисел, например:

Console.WriteLine(double.Epsilon.ToString("0.########....###"));

Ответ 2

Я считаю, что вы можете сделать это, основываясь на том, что вы хотите сделать с дисплеем:

Рассмотрим это:

Double myDouble = 10/3;

myDouble.ToString("G17");

Ваш результат будет:

3.3333333333333335

Посмотрите эту ссылку для почему: http://msdn.microsoft.com/en-us/library/kfsatb94(v=vs.110).aspx

По умолчанию возвращаемое значение содержит только 15 цифр точности, хотя внутренне поддерживается не более 17 цифр. Если значение этого экземпляра имеет более 15 цифр, ToString возвращает PositiveInfinitySymbol или NegativeInfinitySymbol вместо ожидаемого числа. Если вам требуется более высокая точность, укажите формат со спецификацией формата "G17", который всегда возвращает 17 цифр точности или "R", который возвращает 15 цифр, если число может быть представлено с этой точностью или 17 цифр, если число может быть представленной с максимальной точностью.

Вы также можете сделать:

myDouble.ToString("n16");

Это отменит 16-ю и 17-ю цифры шума и вернет следующее:

3.3333333333333300

Если вы хотите отобразить фактическое значение переменной в виде числа, вы, скорее всего, захотите использовать "G17". Если вы пытаетесь отобразить числовое значение, используемое при вычислении с высокой точностью, вы захотите использовать "n16".