При двойном разборе в С#

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

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

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

4796.4000000000005

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

4796.4000000000015

Я понимаю, что использование 32 och 64-битной компиляции должно влиять на то, как система обрабатывает двойные значения, но учитывая, что С# определяет 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.

Ответ 1

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

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

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

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

Ответ 2

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

x86 configuration code

x64 configuration code