#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 является.