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

Почему ToString() округляет мою двойную ценность?

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

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

4b9b3361

Ответ 1

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

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

Получено из Документов MSDN:

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

Ответ 2

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

myDouble.ToString("R")

См. также Спецификатор формата Round-trip ( "R" ):

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

Ответ 4

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

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

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

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

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

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

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

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

Посмотрите "отлично", не так ли?

: -)

Ответ 5

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