Установка минимального количества десятичных разрядов для точности std :: ostream - PullRequest
12 голосов
/ 22 марта 2010

Есть ли способ установить "минимальное" количество десятичных разрядов, которое будет выводить 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

Спасибо! Фил


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

Ответы [ 2 ]

2 голосов
/ 22 марта 2010
cout << setprecision(1) << fixed << d << endl;

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

Редактировать: Это то, что вы хотите. Это изменило бы точность, основанную на d.

cout << setprecision(d?9:1) << fixed << d << endl;
0 голосов
/ 22 марта 2010

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

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

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

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

...