Андрей Кучумов
Андрей Кучумов личный блог
30 января 2013, 13:39

Вопрос к программерам на 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);
По-другому никак не реализовать корректный расчёт?
20 Комментариев
  • Рустам TradeInWest.ru
    30 января 2013, 13:43
    int хранит до 2 147 483 647. Про какие переполнения при 300 000 или 10 000 вы говорите?

    Лонг — максимум в 9 223 372 036 854 775 807
    Ориентируетесь на соответствующие значения в а и b.
      • Рустам TradeInWest.ru
        30 января 2013, 13:47
        Андрей Кучумов, а, вы про произведение уже говорите, понял.
  • Рустам TradeInWest.ru
    30 января 2013, 13:49
    ну а тогда чем не нравится преобразование множителей в более «старшие» типы?
    Что смущает? усложнение читаемости кода? лишние преобразования или еще что?
      • Рустам TradeInWest.ru
        30 января 2013, 13:55
        Андрей Кучумов, ну и вывод?
        Если такая большая неопределенность везде (хотя я сомневаюсь), то ставь везде по максимуму типы.

        Хотя это и дурной стиль. По канонам — надо максимально детально планировать архитектуру и типы подбирать под реальные потребности. Но мы живем не в идеальном мире.
          • Рустам TradeInWest.ru
            30 января 2013, 14:21
            Андрей Кучумов, цену в инт? уай?
            или ты цены всегда умножаешь на какой-то множитель, чтобы было целым?

            Уж что что, а цену сам Бог велел в double или decimal (лучше) пихать. как мне кажется.
            • Sergey F
              30 января 2013, 15:22
              Рустам TradeInWest.ru, если пишешь робота, то цена — double или decimal. Если прогу для оптимизации и тестирования стратегий, то только int. В последнем случае надо предварительно умножить цену, чтоб точность не потерять — для ES mini например надо цену на 100 умножать, ну и комиссию и проскальзывание соот-но учесть нужную.
              • Рустам TradeInWest.ru
                30 января 2013, 15:52
                Тунеядец, ну собственно как вариант я это и прописал выше:
                «или ты цены всегда умножаешь на какой-то множитель, чтобы было целым?»

                но если честно — не вижу в этом смысла большого
  • Андрей Коган
    30 января 2013, 13:51
    Используй decimal, забей на long
    • Рустам TradeInWest.ru
      30 января 2013, 13:52
      Андрей Коган, его int смущает.
      • Андрей Коган
        30 января 2013, 13:58
        Рустам TradeInWest.ru, ну по-любому надо конвертировать из одного типа в другой
        в данном случае я бы так делал:

        int a = 300;
        int b = 400;
        decimal c = (decimal)a * (decimal)b;
      • Андрей Коган
        30 января 2013, 14:12
        Андрей Кучумов, дык с современными компьютерами разница будет не видна.
        Для финансовой сферы рекомендуется использовать decimal.
      • Sergey F
        30 января 2013, 15:23
        Андрей Кучумов, незачто — обращайтесь ещё.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн