Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/48: Рейтинг темы: голосов - 48, средняя оценка - 4.90
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
1

Как сравнить числа после запятой?

12.10.2012, 21:58. Показов 9077. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно вопрос выше, но всё же уточню: как сравнить одно число с другим только руководствуясь числами после запятой(не целыми). Пример: 3.032<1.033(только числами после запятой)?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.10.2012, 21:58
Ответы с готовыми решениями:

Как посчитать числа после запятой?
Здорово, парни. Как посчитать числа после запятой в числе double? Т.е. сколько там знаков.

Как вывести квадратный корень с числа с 4-мя знаками после запятой
подскажите, пожалуйста, как вывести квадратный корень с числа с 4-мя знаками после запятой?

Метод Гаусса. Не выводятся числа после запятой, хотя должны (и если кому-то не сложно, как упростить код?)
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { double x, ...

Вывести числа после запятой
Как вывести числа после запятой,не зная точного кол-во чисел после запятой:D Например,...

14
Модератор
Эксперт по электронике
8951 / 6717 / 921
Регистрация: 14.02.2011
Сообщений: 23,714
12.10.2012, 22:03 2
отбрасывай (вычитай)целую часть и сравнивай
0
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
12.10.2012, 22:10  [ТС] 3
Цитата Сообщение от ValeryS Посмотреть сообщение
отбрасывай (вычитай)целую часть и сравнивай
Не понял, если можно то поподробнее. Допустим у меня есть программа которая выдаёт два числа с целыми числами и знаками после запятой, как мне сравнить эти числа только используя знако после запятой?(при этом правильным должно быть и выражение типа 5.032<3.033)
0
2862 / 2009 / 988
Регистрация: 21.12.2010
Сообщений: 3,715
Записей в блоге: 15
12.10.2012, 22:23 4
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <cmath>
 
int main()
{
    double a(5.032), b(3.033), aint, bint;
    std::cout << modf(a, &aint) << '\n' << modf(b, &bint) << std::endl;
    return 0;
}
1
Модератор
Эксперт по электронике
8951 / 6717 / 921
Регистрация: 14.02.2011
Сообщений: 23,714
12.10.2012, 22:24 5
Цитата Сообщение от aleksand Посмотреть сообщение
два числа с целыми числами и знаками после запятой,
у целых не бывает дробной части, на то они и целые
дробь бывает у float double
первое что пришло на ум( не проверял)
C++
1
2
3
4
double m=5.032;
double n=3.033;
printf("%lf   %lf",m-(int)m,n-(int)n); 
if((m-(int)m)<(n-(int)n))
1
2338 / 1826 / 753
Регистрация: 27.07.2012
Сообщений: 5,407
13.10.2012, 01:35 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const double precision = 0.000001;
 
bool equals(double A, double B)
{
    return (abs(A - B) < precision);
}
 
int main()
{
    double A = 2.546, B = 15.546;
    int intA = a, intB = b;
    double a = A - intA, b = B - intB;
    if (equals(a,b))
        // всё хорошо
    else
        // ну и так тож неплохо
 
    return 0;
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
13.10.2012, 01:55 7
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <math.h>
 
int main()
{
    double  a = 5.032;
    double  b = 3.033;
    double  fa, fb;
 
    fa = a - floor( a );
    fb = b - floor( b );
 
    printf( "a = %f\n", a );
    printf( "b = %f\n", b );
    printf( "%s\n", fa > fb ? "a > b" : "b > a" );
 
    return 0;
}
0
2338 / 1826 / 753
Регистрация: 27.07.2012
Сообщений: 5,407
13.10.2012, 02:06 8
lazybiz, а если равны?
0
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
13.10.2012, 08:56 9
стандартная функция double modf(double x, double *p) разбивает значение х на целую и дробную части, обе с одинаковым знаком, возвращает дробную часть, а целую помещает в место, указанное р.

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream> 
#include <cmath>
using namespace std;
int main() 
{
double x,p,i;
cin >> x;
i= modf(x,&p);//&p ссылается на адрес переменой р 
cout <<  i << endl
<< p << endl; 
return 0; 
}
Добавлено через 1 час 28 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <cmath>
using namespace std;
int main() 
{
double a=3.032,b=1.033,inta,intb,fracta,fractb;
// ввод
// cin >> a >> b;
 
fracta = modf(a,&inta);
fractb = modf(b,&intb);
 
if (fracta>fractb) cout << fracta << " > " << fractb;
else if (fracta<fractb) cout << fracta << " < " << fractb;
else cout << fracta << " = " << fractb;
 
cout << endl;
system ("pause");
return 0; 
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
13.10.2012, 11:14 10
LVV, равенства во втором случае никогда не произойдет.
1
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
13.10.2012, 18:52 11
lazybiz, Вы ошибаетесь. Всё логично и в соответствии с особенностями С++.
Да и проверить нетрудно. Равенство, например, при double a=3.033,b=1.033 срабатывает.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
13.10.2012, 18:58 12
LVV, тогда объясни мне поведение программы при: a=5.033 , b=3.033
0
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
13.10.2012, 19:38 13
Упссссс....
Пардон. Беру свои слова обратно.
Не могу обьяснить...
почему при a=3.033,b=1.033 и при a=5.088,b=3.088срабатывает, а при a=5.033,b=3.033 не хочет...

Но ведь конструкция типа:
if (...) {...}
else if (...) {...}
else if (...) {...}
...
else {...}
должна работать.

А вот здесь не срабатывает. Может подскажете, в чём ошибка. Буду очень благодарен.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
13.10.2012, 19:48 14
Дело в особенности вещественных типов данных. Тут чем больше целая часть, тем меньше дробная, т.к. предпочтение отдается целой. Из-за этого и возникают такие нюансы.
Попробуй выведи максимальное количество знаков после запятой и ты увидишь что числа не равны при большой целой части.
1
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
13.10.2012, 20:07 15
Спасибо.
Ясно.
Наверное, следует знать, до какого десятичного знака сравнивать дробные части, и сделать перед сравнением так (или наподобие этого):
C++
1
2
fracta=floor(fracta*1000)/1000;
fractb=floor(fracta*1000)/1000;
тогда всё работает.
0
13.10.2012, 20:07
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2012, 20:07
Помогаю со студенческими работами здесь

Увеличение числа знаков после запятой
Всем привет! не выходит увеличить число знаков после запятой, конкретно для значений S_A и S_t,...

Насчёт числа знаков после запятой
Вот например у меня массив с числами, у которых по 5 знаков после запятой. Как мне (с помощью какой...

Округление числа до двух знаков после запятой
8. Написать программу, которая предлагает пользователю ввести дробное число, округляет его до двух...

Последовательное получение чисел после запятой у числа пи
Здравствуйте, есть задание получить 2012 чисел числа пи следующих после запятой, проблем с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Как работать с ветками (branch) в Git
InfoMaster 17.01.2025
Система контроля версий Git произвела революцию в процессе разработки программного обеспечения, предоставив разработчикам мощный инструмент для управления изменениями в коде. Одной из наиболее важных. . .
Как откатить последние коммиты в Git
InfoMaster 17.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления изменениями в коде. Одним из. . .
Что такое boilerplate и scaffold, чем они отличаются
InfoMaster 17.01.2025
В современном мире разработки программного обеспечения эффективность и скорость создания качественного кода играют crucial роль в успехе проектов. Разработчики постоянно ищут способы оптимизировать. . .
Чем отличаются ссылки и указатели в С++
InfoMaster 17.01.2025
В современном программировании на C++ эффективная работа с памятью является ключевым аспектом разработки качественного программного обеспечения. Указатели и ссылки представляют собой два. . .
В чем разница между PUT и POST
InfoMaster 17.01.2025
В современной веб-разработке правильное использование HTTP-методов играет ключевую роль в создании надежных и эффективных API-интерфейсов. Протокол HTTP прошел долгий путь развития с момента своего. . .
DTO, POCO и Value Object: что это такое, когда и как использовать
InfoMaster 17.01.2025
Введение в паттерны передачи данных В современной разработке программного обеспечения эффективное управление данными и их передача между различными слоями приложения являются ключевыми аспектами. . .
Что такое pull request в Git
InfoMaster 17.01.2025
В современной разработке программного обеспечения pull request в Git представляет собой ключевой механизм для эффективного взаимодействия между разработчиками при работе над общим кодом проекта. По. . .
Как вернуться к предыдущему коммиту в Git
InfoMaster 17.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде, который позволяет разработчикам эффективно отслеживать и контролировать историю. . .
Что такое паттерны программировани­я и проектирования
InfoMaster 17.01.2025
Роль паттернов в современной разработке программного обеспечения В современном мире разработки программного обеспечения паттерны проектирования стали неотъемлемой частью профессионального подхода. . .
Как добавить конструктор Яндекс Карт на сайт
InfoMaster 17.01.2025
Введение в API Яндекс Карт В современной веб-разработке интеграция картографических сервисов стала неотъемлемой частью многих проектов. API Яндекс Карт представляет собой мощный инструмент для. . .
Что такое javascript:void­­(0) и зачем это нужно
InfoMaster 17.01.2025
Когда вы сталкиваетесь с веб-разработкой, особенно с использованием JavaScript, одной из директив, которая часто встречается, является javascript:void(0). Это выражение вызывает интерес из-за своей. . .
Что такое оркестрация и хореография микросервисов
InfoMaster 17.01.2025
Введение в оркестрацию и хореографию микросервисов В современном мире разработки программного обеспечения микросервисная архитектура стала ключевым подходом к созданию масштабируемых и гибких. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru