Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/120: Рейтинг темы: голосов - 120, средняя оценка - 4.62
Valerko
18 / 18 / 2
Регистрация: 30.11.2010
Сообщений: 164
1

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

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

Как округлить число до целого я знаю,
C++
1
s=(s-floor(s)<0.5)?floor(s):ceil(v)
а как округлить, скажем, число 3.4643 до 3.5 ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2011, 15:09
Ответы с готовыми решениями:

Округление числа double до десятых, до сотых
Приветствую всех, double y=3.1415; нужно округлить y до десятых и сотых,...

Округление числа
Кто-нибудь может подробно-подробно объяснить, как округлять числа в C++. А то я...

Округление числа
Если разложение в ряд тейлора и поиск сумы и заданая точность е.И вот нам надо...

Округление числа
Не пойму, почему компилятор пишет Выражение должно иметь целочисленный или...

Округление мелкого числа до 0
Всем привет, времени мало поэтому пишу сюда суть такова - нужно сделать...

12
IrineK
Заблокирован
06.03.2011, 15:15 2
Умножить на 10
Округлить до целого
Поделить на 10
1
Valerko
18 / 18 / 2
Регистрация: 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
0
IrineK
Заблокирован
06.03.2011, 15:36 4
Проблема известная.
Чтобы наверняка ее избежать, лучше работать со строкой, а не с числом.
1
Valerko
18 / 18 / 2
Регистрация: 30.11.2010
Сообщений: 164
06.03.2011, 15:39  [ТС] 5
Цитата Сообщение от IrineK Посмотреть сообщение
Проблема известная.
Чтобы наверняка ее избежать, лучше работать со строкой, а не с числом.
это как?
0
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, т.е. можно в формальной задаче округления обойтись и без длинной арифметики.

Если будут вопросы по технике реализации - задавай.
1
Valerko
18 / 18 / 2
Регистрация: 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, т.е. можно в формальной задаче округления обойтись и без длинной арифметики.

Если будут вопросы по технике реализации - задавай.
попробую
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
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.
1
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;
}
1
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
06.03.2011, 16:34 10
Или еще проще
C++
1
2
3
s *= 10;
s = floor(s+0.5);
s /= 10;
1
Valerko
18 / 18 / 2
Регистрация: 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;
        }
реализовал вот так, вроде бы все работает правильно, всем спасибо)
0
ЮрийМ
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 4
27.07.2017, 10:31 12
Привет всем. Начитался я вашего кода по самое не могу. Если вам надо вывести на экран, либо в файл округленное значение кокого-то числа number, то смотрите код ниже

C++
1
2
3
4
5
6
7
8
9
#include <iostream> //в файле объявлен fixed
#include <iomanip> //подключаем setprecision
 
int main()
{
    float number = 3.141592654;
 
    cout << fixed {- если нужны нули в конце числа} << setprecision(2) {2 два знака после запятой};
}
Profit! На выходе получаем 3.14 - число пи. Вот оно как просто.
0
_lunar_
1446 / 1362 / 185
Регистрация: 03.05.2011
Сообщений: 3,155
Завершенные тесты: 1
27.07.2017, 14:32 13
Цитата Сообщение от ЮрийМ Посмотреть сообщение
Начитался я вашего кода...
2011 года...

Цитата Сообщение от ЮрийМ Посмотреть сообщение
либо в файл округленное значение кокого-то числа number, то смотрите код ниже
C++
1
2
3
4
5
6
#include <stdio.h>
 
int main() {
    float number = 3.141592654;
    printf("%.2f", number);
}
и не надо никаких фикседов, когда есть обычное форматирование строк.
0
27.07.2017, 14:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2017, 14:32

Быстрое округление числа
Здравствуйте уважаемые программисты! Подскажите как быстрее всего округлить...

Округление дробового числа
Здраствуйте . Нужно написать программку. У пользователя должны спросить какое...

Погрешность числа (округление)
Всем привет,есть алгоритм в котором производится операция умножения часто. В...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru