Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
12.10.2012, 21:58     Как сравнить числа после запятой? #1
Собственно вопрос выше, но всё же уточню: как сравнить одно число с другим только руководствуясь числами после запятой(не целыми). Пример: 3.032<1.033(только числами после запятой)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2012, 21:58     Как сравнить числа после запятой?
Посмотрите здесь:

C++ вывод числа после запятой переменной типа double С++
Как вывести квадратный корень с числа с 4-мя знаками после запятой C++
C++ В строке имеется одна точка с запятой (;). Подсчитать количество символов до точки с запятой и после нее.
C++ Последовательное получение чисел после запятой у числа пи
C++ Насчёт числа знаков после запятой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
12.10.2012, 22:03     Как сравнить числа после запятой? #2
отбрасывай (вычитай)целую часть и сравнивай
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
12.10.2012, 22:10  [ТС]     Как сравнить числа после запятой? #3
Цитата Сообщение от ValeryS Посмотреть сообщение
отбрасывай (вычитай)целую часть и сравнивай
Не понял, если можно то поподробнее. Допустим у меня есть программа которая выдаёт два числа с целыми числами и знаками после запятой, как мне сравнить эти числа только используя знако после запятой?(при этом правильным должно быть и выражение типа 5.032<3.033)
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
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;
}
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
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))
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
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;
}
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
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;
}
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
13.10.2012, 02:06     Как сравнить числа после запятой? #8
lazybiz, а если равны?
LVV
56 / 56 / 3
Регистрация: 15.02.2010
Сообщений: 239
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; 
}
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
13.10.2012, 11:14     Как сравнить числа после запятой? #10
LVV, равенства во втором случае никогда не произойдет.
LVV
56 / 56 / 3
Регистрация: 15.02.2010
Сообщений: 239
13.10.2012, 18:52     Как сравнить числа после запятой? #11
lazybiz, Вы ошибаетесь. Всё логично и в соответствии с особенностями С++.
Да и проверить нетрудно. Равенство, например, при double a=3.033,b=1.033 срабатывает.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
13.10.2012, 18:58     Как сравнить числа после запятой? #12
LVV, тогда объясни мне поведение программы при: a=5.033 , b=3.033
LVV
56 / 56 / 3
Регистрация: 15.02.2010
Сообщений: 239
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 {...}
должна работать.

А вот здесь не срабатывает. Может подскажете, в чём ошибка. Буду очень благодарен.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
13.10.2012, 19:48     Как сравнить числа после запятой? #14
Дело в особенности вещественных типов данных. Тут чем больше целая часть, тем меньше дробная, т.к. предпочтение отдается целой. Из-за этого и возникают такие нюансы.
Попробуй выведи максимальное количество знаков после запятой и ты увидишь что числа не равны при большой целой части.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2012, 20:07     Как сравнить числа после запятой?
Еще ссылки по теме:

C++ Как сделать больше цифр после запятой
Точность в N знаков после запятой числа типа double C++
Доработать код: возвести числа в степень, после сравнить полученные данные и найти большее C++

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

Или воспользуйтесь поиском по форуму:
LVV
56 / 56 / 3
Регистрация: 15.02.2010
Сообщений: 239
13.10.2012, 20:07     Как сравнить числа после запятой? #15
Спасибо.
Ясно.
Наверное, следует знать, до какого десятичного знака сравнивать дробные части, и сделать перед сравнением так (или наподобие этого):
C++
1
2
fracta=floor(fracta*1000)/1000;
fractb=floor(fracta*1000)/1000;
тогда всё работает.
Yandex
Объявления
13.10.2012, 20:07     Как сравнить числа после запятой?
Ответ Создать тему
Опции темы

Текущее время: 06:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru