Подтвердить что ты не робот

Установка минимального количества десятичных знаков для точности std:: ostream

Есть ли способ установить "минимальное" число десятичных знаков, которое выводит std:: ostream?

Например, скажем, у меня есть две неизвестные двойные переменные, которые я хочу напечатать (значения добавлены здесь для иллюстрации):

double a = 0;
double b = 0.123456789;

Я могу установить максимальную десятичную точность, чтобы я выводил b точно

std::cout << std::setprecision(9) << b << std::endl;
>>> 0.123456789

Есть ли способ установить "минимальную" точность (минимальное количество знаков после запятой), сохраняя при этом "максимальную" точность, чтобы

std::cout << a << std::endl << b << std::endl;

дает

0.0
0.123456789

не

0
0.123456789

?

Спасибо! Фил


короткий ответ на это - "Нет". Поток имеет только одну настройку точности, без возможности различать максимальную и минимальную точность. Спасибо всем за ваш щедрый совет!

4b9b3361

Ответ 1

Я не думаю, что есть способ достичь того, что вы просите, не превращая число в строку (с высокой точностью) и отбрасывая конечные нули.

Это уместно, потому что только потому, что есть завершающие нули, это не значит, что там нет точности, и время выполнения не может этого сказать.

Например, если я измеряю вес объекта с дешевой шкалой, он может составлять 1,0 кг.

Если я взвешиваю его с помощью шкалы высокой точности, оно может составлять 1,00000 кг. Просто потому, что есть конечные нули, не означает, что точность должна быть отброшена.

Ответ 2

cout << setprecision(1) << fixed << d << endl;

Используется исправлено после setprecision.

Изменить: Это то, что вы хотите. Это изменит точность, основанную на d.

cout << setprecision(d?9:1) << fixed << d << endl;