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