Kornfeld Eliyahu Peter
MSDN:
Одиночные значения имеют меньшую точность, чем двойные. Единственное значение, которое преобразуется в кажущееся эквивалентным двойное, часто не равно двойному значению из-за различий в точности. В следующем примере результат идентичных операций деления присваивается двойному и одиночному значению. После приведения единичного значения к двойному сравнение двух значений показывает, что они неравны.
http://msdn.microsoft.com/en-us/library/system.double.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-7[
^]
Когда вы пишете эту строку
double f = 10.123 - 10.0;
это то же самое что писать
double f = 10.123d - 10.0d;
поскольку C# по умолчанию имеет двойную точность с плавающей запятой...
Нет способа получить точное значение, но вы можете приблизиться (или продвинуться) к нему...Все, что вам нужно сделать, это решить, какая точность вам нужна...
например, изменив свою линию на
double f = 10.123f - 10.0f
вы получите результат 0.12300014495849609...
Как вы можете видеть в нижней строке, вам придется играть с округлением вверх/вниз при использовании чисел с плавающей запятой...
Однако вам повезло - эта проблема с плавающей запятой была известна Microsoft, и есть другой тип, который можно использовать для вычислений с плавающей запятой -
десятичный[
^]...
У него есть свои недостатки (читайте страницу MSDN), но для вашего диапазона (в зависимости от вашего случая) он даст правильный ответ. попробуйте...
decimal f = 10.123m - 10.0m;
BillWoodruff
+5 ясно, точно и показывает технику, которая решает проблему. Кто бы ни проголосовал за это "а #1", его голова должна быть осмотрена.