Точность C++ - поведение setprecision

Насколько я понимаю, функция setprecision указывает минимальную точность, но когда я запускаю следующий код, я получаю только 3 числа после запятой:

int main()
{
    double a = 123.4567890;
    double b = 123.4000000;
    std::cout << std::setprecision(5) << a << std::endl; // Udesireble 
    std::cout.setf(std::ios::fixed);
    std::cout << std::setprecision(5) << a << std::endl; // Desireble 

    std::cout << std::setprecision(5) << b << std::endl; // Udesireble
    std::cout.unsetf(std::ios::fixed);
    std::cout << std::setprecision(5) << b << std::endl; // Desireble 
    return 0;
}

который печатает:

123.46      // Udesireble
123.45679   // Desireble 
123.40000   // Udesireble
123.4       // Desireble

Можно ли как-то избежать проверки количества цифр после запятой, чтобы узнать, следует ли установить фиксированный?


person SadStudent    schedule 02.09.2013    source источник


Ответы (2)


У меня сложилось впечатление, что вам нужно сначала отформатировать string, а затем заменить конечные нули пробелами.

person Mario Rossi    schedule 02.09.2013
comment
К сожалению, пока это единственное решение, которое работало, но я был просто уверен, что в C++ может быть что-то более элегантное, о чем я просто не знаю. - person SadStudent; 02.09.2013
comment
@SadStudent Ваше требование немного необычное. Обычно используется фиксированное количество десятичных разрядов (и заполнение нулями :-()). Очень хорошо, что вы спросили. - person Mario Rossi; 02.09.2013

Для потоков вы можете использовать две функции. setfill(char_type c), который устанавливает символ для записи, чтобы соответствовать количеству необходимых символов (дополнительная информация здесь)

Существует функция setw(int), которая устанавливает ширину поля отображаемого значения. (документация здесь)

Используя эти функции, вы можете найти решение

person LLenain    schedule 02.09.2013
comment
Я не понимаю, как я могу решить это с помощью этих функций, потому что в лучшем случае они могут помочь мне добавить дополнительные нули, например, в конце, который я написал, я не хочу, я просто хочу до 5 цифр после точки - person SadStudent; 02.09.2013
comment
Как я упоминаю в примере кода, я пробовал это, но тогда это разрушает случаи, когда мне не нужны бессмысленные конечные нули, потому что они фиксированы, я ищу способ, который не заставляет меня проверять каждое количество цифр в каждый дубль, который я хочу поставить в поток - person SadStudent; 02.09.2013