Как привести 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;
Вышеупомянутый подход работает, если вы не хотите беспокоиться об обработке исключений переполнения, и если такое произойдет, вы хотите просто сохранить максимально возможное значение (мой случай), но я знаю, что для многих других сценариев это не будет ожидаемым поведением и, возможно, потребуется обработка исключений.
источник