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

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

Восстановить пароль Регистрация
 
InDark
2 / 2 / 2
Регистрация: 20.07.2015
Сообщений: 49
Завершенные тесты: 1
19.08.2016, 00:47     Форматирование вывода и округление double #1
Доброго времени суток.
Я много подобных тем полистал. Но не нашел ответа.
Мне нужно написать функцию, которая бы получала 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2016, 00:47     Форматирование вывода и округление double
Посмотрите здесь:

Округление Long double. C++
double округление с точность до N знаков C++
Округление double C++
C++ Форматирование вывода
C++ printf. Округление чисел типа double
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
meJevin
 Аватар для meJevin
153 / 145 / 56
Регистрация: 18.11.2015
Сообщений: 600
Завершенные тесты: 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
1046 / 843 / 205
Регистрация: 08.01.2012
Сообщений: 3,020
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
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 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++
Убрать округление double C++
Округление Double C++

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

Или воспользуйтесь поиском по форуму:
meJevin
 Аватар для meJevin
153 / 145 / 56
Регистрация: 18.11.2015
Сообщений: 600
Завершенные тесты: 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
Ответ Создать тему
Опции темы

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