Почему ToString () округляет мое двойное значение? - PullRequest
19 голосов
/ 21 января 2010

Как предотвратить округление моего двойного значения при преобразовании в строку? Я пробовал и Convert.ToString и ToString() с одинаковым результатом.

Например, мой double может выглядеть примерно как 77.987654321, а преобразование двух строк преобразуется в 77.98765. Мне нужно сохранить точность значения как есть.

Ответы [ 5 ]

24 голосов
/ 21 января 2010

По умолчанию метод .ToString() для Double возвращает 15 цифр точности. Если вам нужны полные 17 цифр, которые внутренне содержит двойное значение, вам нужно передать в метод спецификатор формата "G17".

String s = value.ToString("G17");

Источник: Документы MSDN :

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

14 голосов
/ 21 января 2010

Попробуйте что-то вроде

myDouble.ToString("R")

См. Также Спецификатор формата туда-обратно ("R") :

Спецификатор формата туда-обратно ("R") гарантирует, что числовое значение, преобразованное в строку, будет проанализировано обратно в то же числовое значение.

5 голосов
/ 21 января 2010

Класс Джона Скита DoubleConverter имеет метод ToExactString(), который возвращает точное значение типа double в виде строки.

http://www.yoda.arachsys.com/csharp/DoubleConverter.cs

2 голосов
/ 14 февраля 2016

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

Пример без округления:

(Math.Sqrt(7)).ToString("G17") = "2.6457513110645907"

(Math.Sqrt(7)+6).ToString("G17") = "8.6457513110645898"

выглядит немного странно в последних 3 цифрах, верно?

Пример с округлением:

(Math.Sqrt(7)).ToString() = "2.64575131106459"

(Math.Sqrt(7)+6).ToString() = "8.64575131106459"

Смотри "отлично", верно?

: -)

0 голосов
/ 21 января 2010

Никаких гарантий, но попробуйте ToString ("R").

...