Можно ли умножать десятичное число на целое число?

#c# #.net #int #decimal #type-conversion

#c# #.net #int #десятичная дробь #преобразование типов

Вопрос:

Я новичок в C # и .NET, поэтому приношу извинения, если это слишком простой вопрос.

У меня есть десятичная переменная decVar . Мне нужно умножить его на целочисленную переменную intVar . Мне нужно, чтобы результат был decimal . Итак, я должен затем объявить целочисленную переменную как int или как decimal ?

Имея этот код,

 decimal decVar = 0.1m;
decimal decRes = decVar * intVar;
 

должен ли я объявить это так:

 int intVar = 3;
 

или вот так:

 decimal intVar = 3;
 

?

Это финансовый расчет, поэтому мне нужно, чтобы результат был точным 0.3 .

upd: код обновлен (благодаря Джону)

Ответ №1:

Это не имеет значения — значение int будет преобразовано в decimal любом случае: оператора нет *(decimal, int) , просто *(int, int) and *(decimal, decimal) . (И другие типы, конечно.)

Now decimal не может быть неявно преобразован в int , но обратное преобразование допустимо — так что это то, что делает компилятор.

Однако вам нужно будет изменить объявление decVar , поскольку в настоящее время правая часть оператора присваивания является двойной, а не десятичной. Вы имеете в виду 0.1m . Вам тоже понадобятся точки с запятой 🙂

Ответ №2:

Это не имеет никакого значения. Поскольку один аргумент умножения равен decimal , другой также будет преобразован decimal в (если он еще не является одним).

Это преобразование всегда безопасно:

Соображения по преобразованию

Этот тип предоставляет методы, которые преобразуют десятичные значения в SByte, Int16, Int32, Int64, Byte, UInt16, UInt32 и UInt64 и обратно. Преобразования из этих целых типов в десятичные — это расширяющие преобразования, которые никогда не теряют информацию и не вызывают исключений.

Ответ №3:

Не имеет значения, объявляете ли вы его как int или decimal . Оно будет приведено к decimal для вычисления.

Кроме того, вы никогда не сможете гарантировать точность с плавающей запятой, потому что есть числа, которые не могут быть представлены точно в двоичном формате. Вам придется принять другие меры предосторожности, чтобы свести к минимуму ошибки округления.

Комментарии:

1. Голосую за указание на проблемы с двоичным представлением чисел с плавающей запятой.

2. Есть числа, которые также не могут быть представлены точно в десятичной форме. Например, 1m / 5m не является неточным, но 1d / 5d является.