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