2
double amount;
cin >> amount;
if (amount % 1 == 0)
{...}

Вот такой код не работает, поскольку amount в программе имеет тип double, сама ошибка:

E2140 выражение должно относиться к целочисленному типу или типу перечисления без области видимости

По условия задачи, нужно выполнить проверку того, что пользователь ввел число без дробной части в данном конкретном случае и если это так, то уже выполнять код в скобках, а если число дробное, то выполнить уже другое действие.

  • 4
  • 6
    floor проще -- if (amount == floor(amount) { да, введено целое число ...} – avp Jul 09 '22 at 16:24
  • Представленные способы чувствительны к вычислениям промежуточных результатов с повышенной точностью. Перед тестированием на целочисленность и последующим использованием протестированного значения следует сделать что-то вроде {volatile double tmp = static_cast<double>(amount); amount = static_cast<double>(tmp);} или тщательно изучить особенности вычислений чисел с плавающей точкой в конкретном компиляторе. В противном случае, приведённые способы могут давать ошибочные результаты. – wololo Jul 11 '22 at 19:04

3 Answers3

1

Остаток от деления для вещественных чисел считается функцией fmod.

Qwertiy
  • 123,725
  • Зачем забивать гвозди микроскопом? (даже если у ТС есть (очевидно, по незнанию предмета) такое желание) – avp Jul 09 '22 at 21:37
  • @avp, а какие ещё варианты? Кроме чтения строки и парсинга. Диапазон double не очень хочет покрываться целочисленными типами... В принципе, я запостил другой ответ, но не понимаю, чем он лучше. – Qwertiy Jul 09 '22 at 21:40
  • @avp, а, тьфу. Увидел коммент. Ответы надо в ответы писать, а не в комменты. – Qwertiy Jul 09 '22 at 21:41
0

Проверить, что вещественное число целое, можно так:

fabs(x) >= 9007199254740992 || (long long)x == x
Qwertiy
  • 123,725
-1

Опреатор остатка от деления не может быть использован на не целочисленных типах попробуй такой вариант:

if (amount  == (int)amount )

Это преобразование типов и можно будет сравнить является ли amount своему же аналогу только целочисленному.

  • На некоторых входных данных работает неверно. – wololo Jul 09 '22 at 20:38
  • Можно пример?Это же обычное приведение к инту, любая вещественная часть отсекается – StackITS64 Jul 09 '22 at 21:15
  • @StackITS64, не все значения целые значения double поместятся в int (32 бита со знаком это примерно +-2млрд. (точнее см. в /usr/include/limits.h)) – avp Jul 09 '22 at 21:36