Ответ 1
Вы должны использовать Math.Round(x, 2, MidpointRounding.AwayFromZero)
Я создаю сайт электронной торговли, интегрированный с paypal.
Мы берем несколько валют, поэтому я хочу убедиться, что (по причинам бухгалтерского учета) я правильно выполняю любую математику для конвертации валюты.
После умножения конверсии валют * на исходную валюту, я всегда получаю много конечных чисел после десятичной точки.
Есть ли стандартный способ сделать это? Должен ли я усекать или раунд? Нужно ли мне раунд несколько раз, если округление 1/1000 десятичного числа повлияет на округление 1/100 десятичного числа?
Должен ли я делать что-то вроде:
Math.Round(Math.Round(x, 3), 2)
У меня возникли проблемы с поиском хорошей информации о том, как это делается (надеюсь, США и Европа одинаковы).
Вы должны использовать Math.Round(x, 2, MidpointRounding.AwayFromZero)
Я бы предположил, что вы просто должны иметь возможность напрямую использовать Math.Round, поскольку .NET использует Округление банкиров.
Просто помните, что всегда делайте округление абсолютным последним, что вы делаете, чтобы не вводить ошибки округления.
В такой валютной системе я бы также сохранил реальные неосвещенные значения в виде десятичных знаков дополнительно для будущих целей решения проблем.
Если ваш сайт имеет несколько валют, используйте его для правильного округления десятичных знаков в соответствии с текущей валютой и культурой пользователя:
int currencyDecs = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalDigits;
decimal roundedDecimalPrice = Math.Round(decimalPrice, currencyDecs, MidpointRounding.AwayFromZero);