Уже есть два ответа с высокими оценками, которые относятся к 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(...)
2 знака после запятой, чтобы решить проблему.
// 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
.