Вопрос к программерам на C#.
Есть 3 переменных:
a — тип Int;
b — тип Int;
c — тип Long
Столкнулся с тем, что в выражении:
с = a * b;
правая часть, по умолчанию, сначала преобразуется
в Int, а потом в Long. Соответсвенно при больших
a и b и «переполнении» Int (скажем 300 000 и 10 000)
результат получается некорректный.
Приходится заморачиваться конструкцией:
c = Convert.ToInt64(a) * Convert.ToInt64(b);
По-другому никак не реализовать корректный расчёт?
15 |
Читайте на SMART-LAB:
🤖 FabricaONE.АI: последний день сбора заявок на IPO
Сбор заявок идёт до 15:00 мск. Ценовой ориентир — ₽25 за акцию. Книга уже покрыта. Компания планирует привлечь минимум ₽2 млрд для покупки...
Ставка, крипта и портфельные инвестиции: главные тезисы Альфа-Саммита 2026
Светлана Лебедева Центробанк готов к комплексному регулированию криптовалют, которые всё глубже интегрируются в традиционные финансы, новое...
Развал ОПЕК. Какое будущее ждет картель и нефтяной рынок
Вчера, 28 апреля, Объединенные Арабские Эмираты неожиданно объявили о своем выходе с 1 мая 2026 года из ОПЕК и расширенного альянса ОПЕК+. На...
Магнит: конец эпохе? Сделки по портфелю. Оперативный комментарий
Вчера-сегодня совершал сделки по портфелю. Информирую.
***************************************************************...
Лонг — максимум в 9 223 372 036 854 775 807
Ориентируетесь на соответствующие значения в а и b.
Int переполнится и «обрежет» значение, при этом ошибки
не будет.
как правило у компиляторов знаковый. По крайней мере
так делает мой SharpDevelop 4.2
Что смущает? усложнение читаемости кода? лишние преобразования или еще что?
где ещё «вылезет» переполнение, а я не замечу
(на тестинге не отловлю).
Может есть какая-нить глобальная установка компилятору,
как по-умолчанию делать неявные преобразования…
Если такая большая неопределенность везде (хотя я сомневаюсь), то ставь везде по максимуму типы.
Хотя это и дурной стиль. По канонам — надо максимально детально планировать архитектуру и типы подбирать под реальные потребности. Но мы живем не в идеальном мире.
в Int16 или UInt16, по возможности. Тут тоже может
вылезти «переполнение», хотя вроде код прошерстил…
или ты цены всегда умножаешь на какой-то множитель, чтобы было целым?
Уж что что, а цену сам Бог велел в double или decimal (лучше) пихать. как мне кажется.
возможных значение. Считает быстрее, массивы компактнее.
Цена меняется в конечных пунтах.
«или ты цены всегда умножаешь на какой-то множитель, чтобы было целым?»
но если честно — не вижу в этом смысла большого
в данном случае я бы так делал:
int a = 300;
int b = 400;
decimal c = (decimal)a * (decimal)b;
Памяти нажрёт decimal.
Ну и считает поди чуть-чуть медленнее.
Для финансовой сферы рекомендуется использовать decimal.