В C литерал с плавающей точкой, такой как 0.1, является двойным, а не плавающим. Поскольку типы сравниваемых элементов данных различны, сравнение выполняется в более точном типе (double). Во всех реализациях, о которых я знаю, float имеет более короткое представление, чем double (обычно выражается примерно как 6 против 14 десятичных знаков). Кроме того, арифметика в двоичном виде, а 1/10 не имеет точного представления в двоичном.
Таким образом, вы берете число с плавающей запятой 0.1, которое теряет точность, удваиваете его, и ожидаете, что оно сравнится с двойным 0,1, что теряет меньшую точность.
Предположим, мы делали это в десятичном формате, с плавающей точкой, состоящей из трех цифр и двойной, равной шести, и мы сравнивали с 1/3.
У нас есть сохраненное значение с плавающей запятой, равное 0,333. Мы сравниваем его с двойным значением 0,333333. Мы конвертируем число с плавающей запятой в 0,333 в удвоенное значение 0,333000 и находим его другим.
Сравнение в этой статье не между двумя простыми операциями привязки, эти измерения относятся к сценарию, в котором вы добавляете один элемент в WPF ListBox
, который уже есть привязан либо к List
, либо к ObservableCollection
.
Как отмечает автор:
... CLR
List
объект не вызывает автоматически собрание изменено событие. Чтобы получитьListBox
, чтобы забрать изменения, вам придется воссоздать свой список сотрудников и прикрепите заново в свойствоItemsSource
объектаListBox
. Пока это решение работает, оно оказывает огромное влияние на производительность. Каждый раз, когда вы переназначаетеItemsSource
изListBox
в новый объект,ListBox
сначала отбрасывает свой предыдущий items и восстанавливает весь свой список.
Это объясняет разницу в производительности. Несмотря на то, что ObservableCollection
поддерживается списком List
, он реализует интерфейс INotifyCollectionChanged
, который устраняет необходимость в дополнительной обработке.