При двойном разборе в C # - PullRequest
11 голосов
/ 13 марта 2019

У меня есть следующий код:

var d = double.Parse("4796.400000000001");
Console.WriteLine(d.ToString("G17", CultureInfo.InvariantCulture));

Если я скомпилирую и запущу это с использованием конфигурации x86 в Visual Studio, то получу следующий вывод:

4796.4000000000005

Если я вместо этого скомпилирую как x64, я получу это:

4796.4000000000015

Я понимаю, что использование 32 och 64-битной компиляции должно влиять на то, как двойные значения обрабатываются системой, но, учитывая, что C # определяет double как 64-битную, разве результат этой операции не должен быть одинаковым независимо от конфигурации компиляции Я пользуюсь?

Дополнительное наблюдение

На основании комментария относительно double.Parse я написал этот код:

var d0 = double.Parse("4796.400000000001");
double d1 = 4796.400000000001;
Console.WriteLine("d0: " + d0.ToString("G17", CultureInfo.InvariantCulture));
Console.WriteLine("d1: " + d1.ToString("G17", CultureInfo.InvariantCulture));

Я получаю следующий вывод при компиляции как x86:

d0: 4796.4000000000005
d1: 4796.4000000000005

Но я получаю это при компиляции под x64:

d0: 4796.4000000000015
d1: 4796.4000000000005

Обратите внимание, что значения отличаются в версии x64, но не в версии x86.

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Я думаю, что простой ответ на этот вопрос заключается в том, что это ошибка в .NET Framework. Я подал следующий билет по этому вопросу:

https://developercommunity.visualstudio.com/content/problem/488302/issue-with-double-parser.html

Проблема была закрыта как "не будет исправлена" со следующей мотивацией:

Изменения, внесенные в .NET Core для обеспечения стабильности в этих расчеты были большими и несут больший риск, который мы обычно принимаем в .NET Framework.

0 голосов
/ 13 марта 2019

Не уверен, почему есть разница, хотя код в конфигурации x86 отличается от кода в конфигурации x64.

x86 configuration code

x64 configuration code

...