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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 145, средняя оценка - 4.90
Valerko
17 / 17 / 1
Регистрация: 30.11.2010
Сообщений: 164
#1

округление числа до десятых - C++

06.03.2011, 15:09. Просмотров 18251. Ответов 10
Метки нет (Все метки)

Как округлить число до целого я знаю,
C++
1
s=(s-floor(s)<0.5)?floor(s):ceil(v)
а как округлить, скажем, число 3.4643 до 3.5 ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
06.03.2011, 15:15     округление числа до десятых #2
Умножить на 10
Округлить до целого
Поделить на 10
Valerko
17 / 17 / 1
Регистрация: 30.11.2010
Сообщений: 164
06.03.2011, 15:26  [ТС]     округление числа до десятых #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
double s;
cin>>s;
s=floor(s*10)/10;
cout<<s;
return 0;
}
округляет 5.67 до 5.6

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
double s;
cin>>s;
s=ceil(s*10)/10;
cout<<s;
return 0;
}
округляет 5.33 до 5.4
IrineK
Заблокирован
06.03.2011, 15:36     округление числа до десятых #4
Проблема известная.
Чтобы наверняка ее избежать, лучше работать со строкой, а не с числом.
Valerko
17 / 17 / 1
Регистрация: 30.11.2010
Сообщений: 164
06.03.2011, 15:39  [ТС]     округление числа до десятых #5
Цитата Сообщение от IrineK Посмотреть сообщение
Проблема известная.
Чтобы наверняка ее избежать, лучше работать со строкой, а не с числом.
это как?
IrineK
Заблокирован
06.03.2011, 15:51     округление числа до десятых #6
Переводишь число в строку, например так:
C++
1
2
3
4
5
6
double a;
char a_str[80];
/*.....
где-то здесь считаем а
...*/
sprintf_s(a_str,"%18.17f",a);//максимальная точность - 18 значащих цифр
Теперь анализируем строку на разделитель (.).
Если необходимо округлить до десятых, берем первый и второй символ после (.). Переводим их в числа.
Пишем простой if (если второе уже число от 0 до4 - с первым ничего не делаем; в противном случае - к первому прибавляем 1).

Этот алгоритм можно применять для правильного округления в любом знаке.
Что интересно, если число вводится с консоли, оно может сразу обрабатываться как строка, и в этом случае ее длина - 256, т.е. можно в формальной задаче округления обойтись и без длинной арифметики.

Если будут вопросы по технике реализации - задавай.
Valerko
17 / 17 / 1
Регистрация: 30.11.2010
Сообщений: 164
06.03.2011, 15:55  [ТС]     округление числа до десятых #7
Цитата Сообщение от IrineK Посмотреть сообщение
Переводишь число в строку, например так:
C++
1
2
3
4
5
6
double a;
char a_str[80];
/*.....
где-то здесь считаем а
...*/
sprintf_s(a_str,"%18.17f",a);//максимальная точность - 18 значащих цифр
Теперь анализируем строку на разделитель (.).
Если необходимо округлить до десятых, берем первый и второй символ после (.). Переводим их в числа.
Пишем простой if (если второе уже число от 0 до4 - с первым ничего не делаем; в противном случае - к первому прибавляем 1).

Этот алгоритм можно применять для правильного округления в любом знаке.
Что интересно, если число вводится с консоли, оно может сразу обрабатываться как строка, и в этом случае ее длина - 256, т.е. можно в формальной задаче округления обойтись и без длинной арифметики.

Если будут вопросы по технике реализации - задавай.
попробую
kazak
 Аватар для kazak
3030 / 2351 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
06.03.2011, 16:09     округление числа до десятых #8
Цитата Сообщение от Valerko Посмотреть сообщение
округляет 5.67 до 5.6
Цитата Сообщение от IrineK Посмотреть сообщение
Умножить на 10
Округлить до целого
Поделить на 10
Цитата Сообщение от Valerko Посмотреть сообщение
Как округлить число до целого я знаю,
А теперь все вместе
C++
1
2
3
s *= 10;
s=(s-floor(s)<0.5)?floor(s):ceil(v);
s /= 10;
Если надо округлить до n-го знака то умножать и делить надо на 10^n.
IrineK
Заблокирован
06.03.2011, 16:14     округление числа до десятых #9
Если задача конкретная и простая - округлить до десятых и со строками возиться неохота, вот решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
 
int main()
{
    double x;
    cout<<"X = ";
    cin>>x;
    x=x*1000;//берем три цифры после запятой (одну запасную из-за возможной потери данных
                //при преобразовании типов)
    int remn=((int)abs(x)%100)/10;//обрабатываем вторую
    if(remn>4 && remn<10) //реагируем на вторую цифру от 5 до 9
        if(x>0) x+=100;
        else  x-=100;//если округляем отрицательное число
    
    int y=(int)x/100;//берем число с округленной первой цифрой
    x=(double)y/10;//ответ
    cout<<"Rounded X = "<<x;
    return 0;
}
kazak
 Аватар для kazak
3030 / 2351 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
06.03.2011, 16:34     округление числа до десятых #10
Или еще проще
C++
1
2
3
s *= 10;
s = floor(s+0.5);
s /= 10;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2011, 16:45     округление числа до десятых
Еще ссылки по теме:

C++ Округление вещественного числа до заданного количества знаков
C++ Погрешность числа (округление)
C++ Округление числа до ближайшего целого
Округление числа C++
Округление числа до двух цифр C++

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

Или воспользуйтесь поиском по форуму:
Valerko
17 / 17 / 1
Регистрация: 30.11.2010
Сообщений: 164
06.03.2011, 16:45  [ТС]     округление числа до десятых #11
Цитата Сообщение от IrineK Посмотреть сообщение
Если задача конкретная и простая - округлить до десятых и со строками возиться неохота, вот решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
 
int main()
{
    double x;
    cout<<"X = ";
    cin>>x;
    x=x*1000;//берем три цифры после запятой (одну запасную из-за возможной потери данных
                //при преобразовании типов)
    int remn=((int)abs(x)%100)/10;//обрабатываем вторую
    if(remn>4 && remn<10) //реагируем на вторую цифру от 5 до 9
        if(x>0) x+=100;
        else  x-=100;//если округляем отрицательное число
    
    int y=(int)x/100;//берем число с округленной первой цифрой
    x=(double)y/10;//ответ
    cout<<"Rounded X = "<<x;
    return 0;
}
мне нужно округлить значения 2х динамических массивов до десятых =)

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
    for(int j=0;j<n;j++)//округляем L,B до десятых
        {
        L[j]*=10;
        L[j]=floor(L[j]+0.5);
        L[j]/=10;
        B[j]*= 10;
        B[j]=floor(B[j]+0.5);
        B[j]/=10;
        }
реализовал вот так, вроде бы все работает правильно, всем спасибо)
Yandex
Объявления
06.03.2011, 16:45     округление числа до десятых
Ответ Создать тему
Опции темы

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