Уже есть два ответа с высокими оценками, которые относятся к Decimal.Round (...), но я думаю, что требуется немного больше объяснений - потому что есть неожиданное важное свойство Decimal, которое не очевидно.
Десятичное число «знает», сколько десятичных разрядов оно основало на том, откуда оно пришло.
Например, следующее может быть неожиданным:
Decimal.Parse("25").ToString() => "25"
Decimal.Parse("25.").ToString() => "25"
Decimal.Parse("25.0").ToString() => "25.0"
Decimal.Parse("25.0000").ToString() => "25.0000"
25m.ToString() => "25"
25.000m.ToString() => "25.000"
Выполнение тех же операций с Double
не даст десятичных разрядов ("25"
) для каждого из вышеперечисленных.
Если вы хотите, чтобы от десятичного до двух десятичных разрядов было около 95% вероятности, это потому, что это валюта, и в этом случае это, вероятно, хорошо для 95% времени:
Decimal.Parse("25.0").ToString("c") => "$25.00"
Или в XAML вы просто используете {Binding Price, StringFormat=c}
В одном случае я столкнулся с необходимостью использования десятичного разделителя в качестве десятичного разделителя при отправке XML на веб-сервис Amazon. Служба жаловалась, потому что десятичное значение (первоначально из SQL Server) было отправлено как 25.1200
и отклонено (25.12
был ожидаемый формат).
Все, что мне нужно было сделать, это Decimal.Round(...)
с двумя десятичными знаками для решения проблемы.
// This is an XML message - with generated code by XSD.exe
StandardPrice = new OverrideCurrencyAmount()
{
TypedValue = Decimal.Round(product.StandardPrice, 2),
currency = "USD"
}
TypedValue
относится к типу Decimal
, поэтому я не мог просто сделать ToString("N2")
, и мне нужно было округлить его и сохранить как decimal
.