Double ToString дает округленный результат - PullRequest
0 голосов
/ 26 апреля 2018

Почему это простое консольное приложение выводит 100000000000000 вместо 99999999999999.99 или по крайней мере 99999999999999.984, как показывает отладчик?

static void Main(string[] args)
{
    double bigNum = 99999999999999.99;
    Console.WriteLine(bigNum); //Console.WriteLine will internally ToString, but you can add what ever ToString() you want here the result will always be undesired
}

Выход на консоль:

Nope

Вывод отладки:

Для уточнения:

Да, я знаю тип значения decimal и его высшую точность по сравнению с double, но я никогда не слышал о том, что ToString() из double может дать неправильные результаты.

1 Ответ

0 голосов
/ 26 апреля 2018

См .: MSDN для стандартного ToString преобразования:

Если формат равен нулю или пустой строке, возвращаемое значение форматируется с помощью общего числового спецификатора формата («G»).

Это покажет вам, что по умолчанию спецификатор числового формата "G" будет по умолчанию иметь максимум 15 цифр, если это возможно: Спецификатор формата G

По запросу:

double bigNum = 99999999999999.99;

Console.WriteLine(bigNum);                 //default
//100000000000000
Console.WriteLine(bigNum.ToString("G"));   //explicit default
//100000000000000
Console.WriteLine(bigNum.ToString("G17")); //G17
//99999999999999.984
...