Было создано много тем из-за путаницы в том, как работает Math.Round
. По большей части на них отвечают, намекая людям на параметр MidpointRounding
и на то, что большинство людей ожидают MidpointRounding.AwayFromZero
. У меня есть еще один вопрос о фактическом алгоритме, реализованном AwayFromZero.
Дано следующее число (результат ряда вычислений): 13.398749999999999999999999999M
наши пользователи ожидают увидеть тот же результат, который Excel дал бы им 13.39875
. Поскольку в настоящее время они округляют это число до 4 с помощью Math.Round(num, 4, MidpointRounding.AwayFromZero), результат отличается от ожидаемого на 0,0001. Предположительно, причина этого в том, что алгоритм просто смотрит на пятую цифру (4), а затем соответственно округляет. Если бы вы начали округлять с последних 9, реальный математический ответ фактически дал бы вам то же число, что и Excel.
Итак, вопрос... есть ли способ подражать этому поведению, а не текущему?
Я написал рекурсивную функцию, которую мы могли использовать тем временем. Но прежде чем мы запустим его в производство, я хотел посмотреть, что SO думает о проблеме :-)
private decimal Round(decimal num, int precision)
{
return Round(num, precision, 28);
}
private decimal Round(decimal num, int precision, int fullPrecision)
{
if (precision >= fullPrecision) return Math.Round(num, precision);
return Round(Math.Round(num, fullPrecision), precision, --fullPrecision);
}
Редактировать: просто для ясности, я должен был быть более четким в своем исходном сообщении. Запрашиваемая здесь позиция методологии округления - это то, что мне представляют бизнес-аналитики и пользователи, которые сообщают об «ошибке округления». Несмотря на то, что мне много раз говорили, что это не неправильно, просто отличается от того, что они ожидают ... этот отчет продолжает поступать. Так что я просто собираю данные, чтобы собрать как можно больше информации по этой теме, чтобы сообщить об этом пользователи.
В этом случае кажется, что любая другая система, используемая для создания этих средних цен (которые мы должны сопоставить), использует другой уровень точности (10 в базе данных, а Excel по умолчанию имеет значение 15 или что-то в этом роде). Учитывая, что у всех разный уровень точности, я застрял в середине с вопросом о переходе к более низкой точности, каких-то странных правилах округления (как описано выше) или просто о получении результатов, отличных от ожиданий пользователей.