У меня есть это "научное приложение", в котором значение Single
должно быть округлено перед представлением его в пользовательском интерфейсе. Согласно этой статье MSDN, из-за "потери точности" метод Math.Round(Double, Int32)
иногда будет "неожиданно", например. округление от 2.135 до 2.13, а не 2.14.
Как я понимаю, эта проблема не связана с "округлением банкира" (см., например, этот вопрос).
В приложении кто-то, по-видимому, решил решить эту проблему, явно переведя Single
в Decimal
перед округлением (т.е. Math.Round((Decimal)mySingle, 2)
), чтобы вместо этого перегрузить Math.Round(Decimal, Int32)
. Помимо возникающих проблем с двоичным преобразованием, это "решение" также может вызвать выброс OverflowException
, если значение Single
слишком мало или велико для соответствия типу Decimal
.
Улавливая такие ошибки, чтобы вернуть результат из Math.Round(Double, Int32)
, если преобразование завершится неудачно, это не делает меня идеальным решением. Также не перезаписывает приложение для использования Decimal
полностью.
Есть ли более или менее "правильный" способ справиться с этой ситуацией, и если да, что это может быть?