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

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

Войти
Регистрация
Восстановить пароль
 
InDark
2 / 2 / 2
Регистрация: 20.07.2015
Сообщений: 49
Завершенные тесты: 1
#1

Форматирование вывода и округление double - C++

19.08.2016, 00:47. Просмотров 185. Ответов 6
Метки нет (Все метки)

Доброго времени суток.
Я много подобных тем полистал. Но не нашел ответа.
Мне нужно написать функцию, которая бы получала double число, округляла его до сотых(потом идет вывод данного числа, те можно и в строковом представлении) и возвращало бы его в виде строки. Посмотрев примеры я нашел что-то типа этого:
C++
1
2
3
4
5
6
7
8
std::string RoundAndTransformToString(double number)
{
std::stringstream stream;
stream << std::fixed << std::setprecision(2);
stream << number;
 
return stream.str();
}
Все работает, все выводит. Но, если число не имеет дробной части, то выводятся незначащие нули. Те если я записал число 2.1, то получается строка 2.10. Суть вопроса: можно ли убрать незначащие нули в строке без написания самописных велосипедов? То есть, пользуясь только методами стандартных библиотек, без всяких циклов и проверок?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
meJevin
 Аватар для meJevin
154 / 146 / 57
Регистрация: 18.11.2015
Сообщений: 623
Завершенные тесты: 1
19.08.2016, 01:17     Форматирование вывода и округление double #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Так хочешь?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <conio.h>
#include <string>
#include <sstream>
#include <iomanip>
#include <algorithm>
 
std::string RoundAndTransformToString(double number)
{
    std::stringstream stream;
    stream << std::fixed << std::setprecision(2);
    stream << number;
 
    auto str = stream.str();
 
    str.erase(std::remove_if(str.begin() + 3, str.end(), [](char c) { return c == '0'; }), str.end());
 
    return str;
}
 
int main()
{
    double 
    test = 0.007,
    test2 = 2.1,
    test3 = 2.8990,
    test4 = 0,
    test5 = 3;
 
    std::cout << RoundAndTransformToString(test)  << "\n"
              << RoundAndTransformToString(test2) << "\n"
              << RoundAndTransformToString(test3) << "\n"
              << RoundAndTransformToString(test4) << "\n"
              << RoundAndTransformToString(test5) << std::endl;
 
    _getch();
}
InDark
2 / 2 / 2
Регистрация: 20.07.2015
Сообщений: 49
Завершенные тесты: 1
19.08.2016, 09:42  [ТС]     Форматирование вывода и округление double #3
Спасибо. А с помощью флагов форматирования вывода это никак сделать нельзя?

Добавлено через 18 минут
Видимо, я не правильно сформулировал вопрос. Мне нужно чтобы выводилось не больше двух знаков после запятой, но при этом, если это незначащие нули, то их вовсе убрать. Чтобы не было бессмысленных цифр.
3.01; 3.00, 3.10, 2.21 -> 3.01; 3; 3.1; 2.21 - таким образом.
MansMI
1116 / 913 / 231
Регистрация: 08.01.2012
Сообщений: 3,294
19.08.2016, 10:52     Форматирование вывода и округление double #4
C++
1
2
3
4
5
6
7
    double a[]={3,4.789,6.10,4.1,5.12};
    for(int i=0; i<5; i++)
    {
        char s[20];
        sprintf(s,"%.2lf",a[i]);
        cout<<atof(s)<<endl;
    }
John Prick
757 / 690 / 124
Регистрация: 27.07.2012
Сообщений: 1,975
Завершенные тесты: 3
19.08.2016, 11:24     Форматирование вывода и округление double #5
fixed не надо устанавливать просто. Будет выводить после запятой столько знаков, сколько указано в setprecision, но только если они есть.
InDark
2 / 2 / 2
Регистрация: 20.07.2015
Сообщений: 49
Завершенные тесты: 1
20.08.2016, 00:25  [ТС]     Форматирование вывода и округление double #6
John Prick, вы уверены? Когда я выставлял setprecision(2), то в случае, если число имело 3 разряда(2.22) то выводилось 2.2. Если 22.2 - 22.

Добавлено через 2 минуты
MansMI, sprintf() сишная функция, мне бы не желательно ее использовать. В целом, я написал свою небольшую функцию для убирания нулей. Но может есть еще какие-то варианты?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2016, 01:24     Форматирование вывода и округление double
Еще ссылки по теме:

Убрать округление double C++
C++ Ошибка вывода значения 0 типа double
Почему мы пишем double x (double y)? а не через запятую double x,y C++
C++ Форматирование вывода в c++
Округление Double C++

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

Или воспользуйтесь поиском по форуму:
meJevin
 Аватар для meJevin
154 / 146 / 57
Регистрация: 18.11.2015
Сообщений: 623
Завершенные тесты: 1
20.08.2016, 01:24     Форматирование вывода и округление double #7
Цитата Сообщение от InDark Посмотреть сообщение
Спасибо. А с помощью флагов форматирования вывода это никак сделать нельзя?
Про флаги форматирования я не знаю, но так ведь работает, вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <conio.h>
#include <string>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <vector>
 
std::string RoundAndTransformToString(double number)
{
    std::stringstream stream;
    stream << std::fixed << std::setprecision(2);
    stream << number;
 
    auto str = stream.str();
 
    bool removeFloat = true;
    for (auto itr = std::find(str.begin(), str.end(), '.') + 1; itr != str.end() ; ++itr)
        if (*itr != '0')
            removeFloat = false;
 
    if (removeFloat)
    {
        str.resize((size_t)std::distance(str.begin(), std::find(str.begin(), str.end(), '.')));
        return str;
    }
 
    str.erase(std::remove_if(str.begin() + 1, str.end(), [](char c) { return c == '0'; }), str.end());
 
    return str;
}
 
int main()
{
    std::vector<double> testNums{ 0.007, 2.1, 2.007, 2.89901, 0, 2.559, 146.001, 6.999, 0.803};
 
    for (auto i : testNums) std::cout << i << " --> " << RoundAndTransformToString(i) << std::endl;
 
    _getch();
}
Yandex
Объявления
20.08.2016, 01:24     Форматирование вывода и округление double
Ответ Создать тему
Опции темы

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