Есть ли способ получить строку, показывающую точное значение 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
в строку с полной точностью?