Я вижу что-то странное с сохранением двойников в словаре, и я не совсем понимаю, почему.
Вот код:
Dictionary<string, double> a = new Dictionary<string, double>();
a.Add("a", 1e-3);
if (1.0 < a["a"] * 1e3)
Console.WriteLine("Wrong");
if (1.0 < 1e-3 * 1e3)
Console.WriteLine("Wrong");
Второй оператор if работает как положено; 1,0 не менее 1,0. Теперь первый оператор if оценивается как true. Очень странно то, что когда я наводю курсор мыши на if, intellisense сообщает мне false, но код успешно перемещается в Console.WriteLine.
Это для C # 3.5 в Visual Studio 2008.
Это проблема точности с плавающей запятой? Тогда почему второй оператор if работает? Я чувствую, что упускаю что-то очень фундаментальное здесь.
Любое понимание приветствуется.
Edit2 (Немного переформулировав вопрос):
Я могу принять математическую проблему точности, но мой вопрос сейчас таков: почему наведение правильно оценивается? Это также верно для промежуточного окна. Я вставляю код из первого оператора if в промежуточное окно, и оно оценивает false.
Обновление
Прежде всего, большое спасибо за все великолепные ответы.
У меня также возникают проблемы при воссоздании этого в другом проекте на той же машине. Глядя на настройки проекта, я не вижу различий. Глядя на IL между проектами, я не вижу различий. Глядя на разборки, я не вижу видимых отличий (кроме адресов памяти). Тем не менее, когда я отлаживаю оригинальный проект, я вижу:
В ближайшем окне сообщается, что if ложно, но код попадает в условное выражение.
В любом случае, я думаю, что лучший ответ - подготовиться к арифметике с плавающей запятой в этих ситуациях. Причина, по которой я не мог этого допустить, больше связана с вычислениями отладчика, отличающимися от времени выполнения. Так что большое спасибо Брайану Гидеону и Стефентирону за некоторые очень проницательные комментарии.