У меня есть следующий код:
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.