ToString ("F") теряет точность относительно ToString ("G")? - PullRequest
1 голос
/ 05 марта 2012

Я программирую на C # с использованием .Net 3.5, пытаясь контролировать формат, в котором плавающие выражения выводятся в виде строк.

Однако я вижу неожиданное поведение. Если мой код содержит (например):

значение с плавающей запятой = 50,8836975;

Редактировать Извините, этот (удаленный) код «образца» оказался бесполезным. По сути, мой вопрос состоял в том, чтобы попытаться объяснить результаты моих отладочных операторов ниже, когда я установил точку останова после того, как «value» - float C # - был назначен результат вычисления. Jon Skeet * Ответ 1012 * - это именно то, что мне было нужно (его первая строка приводит меня к заданию для бесполезного кода).

Затем в окне Immediate я вижу следующие результаты:

?value
50.8836975
?value.ToString("G9")
"50.8836975"
?value.ToString("F9")
"50.883700000"

Может кто-нибудь объяснить, почему мое значение в формате F9, похоже, потеряло 3 цифры точности?

1 Ответ

8 голосов
/ 05 марта 2012

Ваш вопрос неясен, поскольку вы дали реальное значение без суффикса f и попытались присвоить его переменной float.Если вы на самом деле используете float переменную, то точное значение равно

50.883697509765625

Если вы на самом деле используете double переменную, то точное значение:

50.8836974999999966939867590554058551788330078125

Я получаю те же результаты, что и вы, для F9 , если вы используете float, но не если вы используете double.

Причинадля пониженной точности раскрывается в документации для System.Single (float):

По умолчанию значение Single содержит только 7 десятичных цифр точности, хотямаксимум 9 цифр поддерживается внутри.

Я полагаю, что F правильно отображает все реальные цифры точности, пытаясь не дать вам поверить, что вы на самом деле получили больше информации, чем имеете.

...