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