Что лучший способ состоит в том, чтобы сравнить Дважды и Интервал?

Использовать ли HashSet<> или List<> сводится , как необходимо получить доступ набору . Если необходимо гарантировать порядок пунктов, используйте Список. Если Вы не делаете, используйте HashSet. Позвольте Microsoft волноваться о реализации их алгоритмов хеширования и объектов.

А HashSet получит доступ к объектам, не имея необходимость перечислять набор (сложность O (1) или около него), и потому что Список гарантирует порядок, в отличие от HashSet, некоторые объекты должны будут быть перечислены (сложность O (n)).

24
задан John Saunders 26 March 2012 в 18:46
поделиться

3 ответа

Вы действительно не можете сравнивать значения с плавающей запятой и целые числа наивно; в частности, поскольку есть классические задачи представления с плавающей запятой . Что вы можете сделать, так это вычесть одно из другого и посмотреть, меньше ли разница между ними, чем некоторая точность, которая вам нужна, например:

int iValue = 0;
double dValue = 0.0;

var diff = Math.Abs(dvalue - iValue);
if( diff < 0.0000001 ) // need some min threshold to compare floating points
   return true; // items equal

Вы действительно должны сами определить, что равенство означает для вас. Например, вы можете захотеть округлить значение с плавающей запятой до ближайшего целого числа, так что 3.999999981 будет "

49
ответ дан 28 November 2019 в 23:01
поделиться

Крайне плохая идея сравнивать целые числа и числа с плавающей запятой на равенство на любом языке. Это работает в очень простых случаях, но после того, как вы вообще выполните какие-либо вычисления, вероятность того, что программа сделает то, что вы хотите, резко уменьшается.

Это связано с тем, как числа с плавающей запятой хранятся в двоичном формате, цифровая система.

Если вы уверены, что хотите использовать это, создайте класс, чтобы сделать ваше собственное число с дробями. используйте одно int для сохранения целого числа, а другое int для сохранения дроби.

4
ответ дан 28 November 2019 в 23:01
поделиться

Это действительно зависит от того, что вы считаете «равным». Если вы хотите, чтобы ваше сравнение возвращало true тогда и только тогда, когда double точно соответствует целочисленному значению (т. Е. Не имеет дробного компонента), вы должны преобразовать свой int в double, чтобы выполнить сравнение:

bool isEqual = (double)iValue == dValue;

Если будет рассматриваться что-то вроде 1.1 равным 1, вы можете преобразовать двойное значение в int (если вы хотите полностью игнорировать дробный компонент) или округлить двойное значение, если хотите, чтобы 1,9 было равно 2.

1
ответ дан 28 November 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: