Как найти остаток от деления вещественного числа

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

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

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

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

задан 9 июл 2022 в 16:08

Єгор Тітаренко's user avatar

4

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

ответ дан 9 июл 2022 в 20:42

Qwertiy's user avatar

QwertiyQwertiy

121k24 золотых знака121 серебряный знак291 бронзовый знак

3

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

fabs(x) >= 9007199254740992 || (long long)x == x

ответ дан 9 июл 2022 в 21:40

Qwertiy's user avatar

QwertiyQwertiy

121k24 золотых знака121 серебряный знак291 бронзовый знак

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

if (amount  == (int)amount )

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

ответ дан 9 июл 2022 в 20:13

StackITS64's user avatar

3


Форум программистов Vingrad

Модераторы: Daevaorn

Страницы: (2) Все [1] 2 
( Перейти к первому непрочитанному сообщению )

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> остаток от деления вещественных чисел 

:(

   

Опции темы

PRF
Дата 29.9.2008, 22:20 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет

Привет. Ребята как получить остаток от деления. 

double A = 1.23202;

A % 1 =  выдает ошибку, но это понятно, так вот, как получить остаток от деления вещественного числа???
Заранее спасибо.

PM MAIL   Вверх
volvo877
Дата 29.9.2008, 22:38 (ссылка)
|    (голосов:1)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Комодератор
Сообщений: 2072
Регистрация: 15.11.2004

Репутация: 1
Всего: 116

Попробуй функцию fmod из math…

PM MAIL   Вверх
sergejzr
Дата 30.9.2008, 00:13 (ссылка)
|  (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Un salsero
Group Icon

Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360

Остатка от деления вещественного числа в природе быть не может.

———————

Me.
FB.
LinkedIn.
ORCID.
YT.

PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
NebelDT
  Дата 30.9.2008, 08:48 (ссылка)
   | (голосов:4)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.9.2008
Где: RU

Репутация: -1
Всего: -10

Как тебе такой примечик??? smile

Код

#include <stdio.h>
#include <math.h >
main()
{
double i=0,j=0,N=0,M=0,K=0,X=0,Z=0,G=0;
scanf("%f%f",&N,&K);
j=K;i=2;G=i;
while(i<=N){
X=(G%K); :shok 
if(X==0){Z++;}
i++;G++;
}
printf("%f",Z);
return (0);
}

PM MAIL WWW YIM   Вверх
mrbrooks
Дата 30.9.2008, 08:55 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

трололомен
****

Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306

NebelDT, это че за дичь?

PM MAIL   Вверх
Alexeis
Дата 30.9.2008, 09:15 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Амеба
Group Icon

Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459

NebelDT, а теперь подумай smile . 
PRF, возможно тебе следует привести числа с плавающей точкой к целым и потом получить остаток деления целых чисел.

———————

Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

PM ICQ Skype   Вверх
vinter
Дата 30.9.2008, 12:32 (ссылка)
|    (голосов:1)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Explorer
****

Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56

кастанув спелл  телепатии, я решил, что тебе нужно следущее 

Код

double A = 1.23202;
double B = A - static_cast<long>(A); 

———————

Мой блог

PM MAIL WWW   Вверх
inside_pointer
Дата 30.9.2008, 13:07 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12

Код

#include <stdio.h>
#include <math.h>

main()
{
    printf("%gn", fmod(1.555, 1.0));
    return 0;
}

подключение математической библиотеки
[[email protected] tmp]$ cc -lm test.c -o test

PM MAIL   Вверх
volvo877
Дата 30.9.2008, 13:17 (ссылка)
|    (голосов:1)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Комодератор
Сообщений: 2072
Регистрация: 15.11.2004

Репутация: 1
Всего: 116

inside_pointer, во втором посте что было, не заметил? Однако, здесь появилось мнение, что разработчики С/С++ и библиотек — полные идиоты, и занимаются не тем, чем нужно, ибо остатка быть не может… Значит, твой пост — фикция… Не может быть такой функции в природе, ибо считать ей НЕЧЕГО…

PM MAIL   Вверх
vinter
Дата 30.9.2008, 14:13 (ссылка)
|    (голосов:2)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Explorer
****

Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56

Цитата(volvo877 @  30.9.2008,  14:17 Найти цитируемый пост)
Не может быть такой функции в природе, ибо считать ей НЕЧЕГО…

конечно нечего, любое вещественое число, делиться на любое другое без остатка. Значит у вещественных чисел нет остатка ;)

———————

Мой блог

PM MAIL WWW   Вверх
system
Дата 30.9.2008, 16:04 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 48
Регистрация: 16.5.2008

Репутация: нет
Всего: 2

Код

#include <iostream>
#include <math.h>

double rest( double x, double y ) {
double i, f;
        if (y == 0.0) {
                return 0.0;
        }
        i = floor(x/y);
        f = x - i*y;
        if ((x < 0.0) != (y < 0.0))
                f = f-y;
        return f;
}

int main() {
        std::cout << rest( -10.1, 3.1 ) << std::endl; 
        return 0;
}
//out : -0.8

Это сообщение отредактировал(а) system — 30.9.2008, 16:56

PM MAIL   Вверх
korian
Дата 30.9.2008, 20:10 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 650
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17

шото поискав по инету нашел тока такое определение:

Цитата
По определению найти частное и остаток от деления целого числа а на целое число b, отличное от нуля, означает нахождение целых q и r (называемых соответственно частным и остатком), удовлетворяющих двум условиям:
1) a=b*q + r
2) 0 <= r < |b|

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

PM   Вверх
Alexeis
Дата 30.9.2008, 21:22 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Амеба
Group Icon

Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459

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

———————

Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

PM ICQ Skype   Вверх
korian
Дата 1.10.2008, 11:50 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 650
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17

Alexeis, вы имеете ввиду, что функция fmod делает что-то типа:
floor(x) % floor(y) ?
если б это было так, то fmod(5., 2.5) должен быть равен 1
а так оно равно нулю, что вообщем-то и правильно, т.к. результат деления 5 на 2.5 целое число.

PM   Вверх
J0ker
Дата 1.10.2008, 19:32 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14

 

smile

Код

The fmod function calculates the floating-point remainder f of x / y such that x = i * y + f, where i is an integer, f has the same sign as x, and the absolute value of f is less than the absolute value of y.

———————

user posted image

PM MAIL   Вверх



















Страницы: (2) Все [1] 2 

Ответ в темуСоздание новой темы
Создание опроса
Правила форума «С++:Общие вопросы»
Earnest
Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл
    черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе — для этого существует «Центр Помощи».
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением,
Earnest
Daevaorn

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »

Tankist 90

0 / 0 / 2

Регистрация: 27.04.2015

Сообщений: 348

1

Как найти остаток от деления чисел с плавающей точкой?

03.11.2016, 11:17. Показов 33244. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Приветствую. Есть код:

C++
1
2
3
4
5
6
7
for(int i=0;i<n;i++)
    {
        if(mas[i]%2.0==0.0)
        {
          t++;
        }
    }

Пишет что операция «%» невозможна, так как тип данных вещественный… (mas[i])



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

03.11.2016, 11:17

Ответы с готовыми решениями:

Найти сумму чисел в диапазоне [a;b], у которых остаток от деления на 7 такой же, как и у b при делении на 7
доброго времени суток, задание такое же самое — Вводятся числа a и b. Найти сумму таких чисел в…

Числа с плавающей точкой после деления
Помогите, какая тут ошибка? мне нужно чтобы вышло числа с плавающей точкой после деления( например,…

Найти сумму таких чисел в диапазоне [a;b], у которых остаток от деления на 7 такой же, как и у b при делении на 7.
Вводятся числа a и b. Найти сумму таких чисел в диапазоне , у которых остаток от деления на 7 такой…

Для двух целых чисел найти остаток и частное от целочисленного деления, частное от вещественного деления
Уважаемые форумчане помогите пожалуйста с двумя программами.
Это вопрос жизни и отчисления, я…

5

Форумчанин

Эксперт CЭксперт С++

8194 / 5044 / 1437

Регистрация: 29.11.2010

Сообщений: 13,453

03.11.2016, 11:23

2

Цитата
Сообщение от Tankist 90
Посмотреть сообщение

Пишет что операция «%» невозможна, так как тип данных вещественный… (mas[i])

Всё верно. Деление по модулю через % для вещественных чисел невозможно. Сохраняйте дробную часть, преобразовывайте в целое, делите, добавляйте дробную часть.



1



79 / 67 / 28

Регистрация: 22.04.2016

Сообщений: 384

03.11.2016, 11:23

3

Лучший ответ Сообщение было отмечено Tankist 90 как решение

Решение

Tankist 90, Потому что операция «%» предназначена только для чисел типа int.
Для того, чтобы найти остаток от деления для чисел с плавающей точкой используйте функцию fmod.
http://cppstudio.com/post/1163/



2



Эксперт С++

3222 / 1749 / 435

Регистрация: 03.05.2010

Сообщений: 3,867

03.11.2016, 11:36

4

Цитата
Сообщение от igdev
Посмотреть сообщение

Для того, чтобы найти остаток от деления для чисел с плавающей точкой используйте функцию fmod.

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



1



79 / 67 / 28

Регистрация: 22.04.2016

Сообщений: 384

03.11.2016, 11:43

5

Mr.X, мне кажется, что в данном случае больше подойдет функция fmod. Т.к. не нужно будет проверять какой остаток получился: отрицательный или нет; или применять к остатку функцию abs();



0



Эксперт С++

3222 / 1749 / 435

Регистрация: 03.05.2010

Сообщений: 3,867

03.11.2016, 11:51

6

Цитата
Сообщение от igdev
Посмотреть сообщение

мне кажется, что в данном случае больше подойдет функция fmod. Т.к. не нужно будет проверять какой остаток получился: отрицательный или нет

Ну, автору это не грозит, так как он остаток на ноль проверяет.
Функция std::remainder удобнее потому, что у нее название более говорящее и легче запоминается. Я, например, никогда не мог запомнить чем функция std::fmod отличается от функции std::modf, всегда в описание приходилось лезть. Дурацкие названия функций — потенциальный источник ошибок, так что лучше стараться такими не пользоваться.



2



Прототип функции fmod:

     double fmod(      double num,      double denom );
      float fmod(       float num,       float denom );
long double fmod( long double num, long double denom );

Заголовочный файл

Название Язык
math.h С
cmath С++

Описание

Функция fmod вычисляет остаток от деления и возвращает значение с плавающей точкой, оставшуюся часть от целочисленного деления параметров num/denom.

Остаток от деления является результатом вычитания из числителя, произведение целого частного num / denom на знаменатель:

остаток = числитель — (целое частное) * знаменателю

В Си, определён только один прототип данной функции, с типом данных double.

Параметры:

  • num
    Вещественное значение — числитель.
  • denom
    Вещественное значение — знаменатель.

Возвращаемое значение

Остаток от деления числителя на знаменатель.

Пример: исходный код программы

// пример использования функции fmod

#include <iostream>                                             // для оператора cout
#include <cmath>                                                // для функции fmod

int main()
{
  std::cout << "fmod(7.3, 2.9)      = "  << fmod(7.3, 2.9)    << std::endl;
  std::cout << "fmod(15.5, 2.2)  = "  << fmod(15.5, 2.2) << std::endl;

  return 0;
}

Пример работы программы

CppStudio.com

fmod(7.3, 2.9) = 1.5
fmod(15.5, 2.2) = 0.1

Понравилась статья? Поделить с друзьями:
  • Как найти баскетбольные площадки
  • Как найти количество вариантов кода
  • Как понять составить алгоритм
  • Как найти если в машине есть жучок
  • Составьте как проверить мягкий знак