Используйте фиксированную точку decimal
, если хотите стабильность в пределах точности. Есть накладные расходы, и вы должны явно указать, хотите ли вы конвертировать в плавающую точку. Если вы конвертируете в плавающую точку, вы снова введете неустойчивости, которые, похоже, беспокоят вас.
Альтернативно вы можете преодолеть это и научиться работать с ограниченной точностью арифметики с плавающей запятой. Например, вы можете использовать округление для сближения значений, или вы можете использовать сравнения epsilon для описания допусков. «Эпсилон» - это константа, которую вы настраиваете, которая определяет допуск. Например, вы можете выбрать, чтобы два значения были равными, если они находятся в пределах 0.0001 друг от друга.
Мне кажется, что вы можете использовать перегрузку оператора, чтобы сделать сравнения epsilon прозрачными.Это было бы очень круто.
Для представлений мантиссы-экспоненты EPSILON необходимо вычислить, чтобы оставаться в пределах отображаемой точности. Для числа N Epsilon = N/10E + 14
System.Double.Epsilon
- наименьшее представимое положительное значение для типа Double
. Это тоже маленький для нашей цели. Read Microsoft's advice on equality testing
Это что-то программисты должны знать, хотя, особенно если они работают с очень большими или очень малыми числами, где точность может иметь важное значение. – tloach 2008-10-07 09:56:23
Не обязательно очень большой или очень маленький - точность с плавающей точкой одинакова независимо от общего размера номера. Проблема заключается в том, что вы * смешиваете * очень большие и очень маленькие значения, например, добавляя их вместе. – 2008-10-07 09:58:49
Dark - на самом деле это не так. Пространство представляемых значений намного плотнее около 0 и гораздо более разреженное, когда вы выходите на бесконечность (например, 2^24 + 1 не может быть точно отображено с использованием стандарта с плавающей точкой IEEE для 32-битных удвоений) – SquareCog 2008-10-10 16:07:12