Используйте тип с фиксированной точкой decimal
, если вы хотите стабильности в пределах точности. Есть накладные расходы, и вы должны явно привести, если вы хотите преобразовать в число с плавающей запятой. Если вы преобразуете в число с плавающей запятой, вы снова будете проявлять нестабильность, которая вас беспокоит.
Также вы можете преодолеть это и научиться работать с с ограниченной точностью арифметики с плавающей точкой. Например, вы можете использовать округление, чтобы сделать значения сходящимися, или вы можете использовать сравнения эпсилон, чтобы описать допуск. «Эпсилон» - это установленная вами константа, определяющая допуск. Например, вы можете считать два значения равными, если они находятся в пределах 0,0001 друг от друга.
Мне пришло в голову, что вы можете использовать перегрузку операторов, чтобы сделать сравнения эпсилонов прозрачными. Это было бы очень круто.
Для представлений с показателем мантиссы EPSILON должен быть вычислен так, чтобы он оставался в пределах представимой точности. Для числа N Эпсилон = N / 10E + 14
System.Double.Epsilon
- наименьшее представимое положительное значение для типа Double
. Это слишком маленький для нашей цели. Прочитайте Рекомендации Microsoft по тестированию на равенство