Как привести double
к decimal
которому используется при разработке валюты. Куда M
деваться?
decimal dtot = (decimal)(doubleTotal);
Ответы:
Вы используете только M
для числового литерала, когда вы приводите его просто:
decimal dtot = (decimal)doubleTotal;
Обратите внимание, что число с плавающей запятой не подходит для сохранения точного значения, поэтому, если вы сначала сложите числа, а затем конвертируете в, Decimal
вы можете получить ошибки округления. Возможно, вы захотите преобразовать числа в, Decimal
прежде чем складывать их вместе, или убедитесь, что числа не являются числами с плавающей запятой.
Вы можете преобразовать двойное число в десятичное, как это, без M
буквального суффикса:
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
Вы должны использовать M
при объявлении нового буквального десятичного значения:
decimal dec = 123.45M;
(Без M
символа 123.45 считается двойным и не компилируется.)
использовать класс преобразования по умолчанию: Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
double
в decimal
, учитывая, что для double
значения вроде (1000000.0 / 3.0) в некоторых случаях это было бы хотите обрезать "лишнюю" точность, получая 333333.333333333D, но в других случаях нужно сохранить ее, давая 333333.333333333313931D. Вместо того, чтобы просто говорить «преобразовать в десятичное», код должен указывать, как это преобразование должно выполняться.
Convert.ToDecimal(double)
такое же, как (decimal)doubleTotal
, за исключением того, что если doubleTotal
вы измените его на другой тип, вы, вероятно, избежите ошибки времени компиляции и представите ошибку времени выполнения, которую труднее найти, потому что другой ToDecimal может быть вызвано переопределение. Оператор приведения более явный ...
Что ж, это старый вопрос, и я действительно использовал некоторые из представленных здесь ответов. Тем не менее, в моем конкретном сценарии было возможно, что double
значение, которое я хотел преобразовать, decimal
часто было больше, чем decimal.MaxValue
. Итак, вместо обработки исключений я написал этот метод расширения:
public static decimal ToDecimal(this double @double) =>
@double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
Вышеупомянутый подход работает, если вы не хотите беспокоиться об обработке исключений переполнения, и если такое произойдет, вы хотите просто сохранить максимально возможное значение (мой случай), но я знаю, что для многих других сценариев это не будет ожидаемым поведением и, возможно, потребуется обработка исключений.