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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 145, средняя оценка - 4.90
Valerko
17 / 17 / 1
Регистрация: 30.11.2010
Сообщений: 164
06.03.2011, 15:09     округление числа до десятых #1
Как округлить число до целого я знаю,
C++
1
s=(s-floor(s)<0.5)?floor(s):ceil(v)
а как округлить, скажем, число 3.4643 до 3.5 ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2011, 15:09     округление числа до десятых
Посмотрите здесь:

C++ Округление мелкого числа до 0
C++ Округление дробового числа
C++ Округление числа
Быстрое округление числа C++
Округление числа double до десятых, до сотых C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
3029 / 2350 / 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
3029 / 2350 / 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++

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

Или воспользуйтесь поиском по форуму:
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     округление числа до десятых
Ответ Создать тему
Опции темы

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