2010-03-22 8 views
12

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

?

Спасибо! Фил


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

+0

Внимательно прочитайте вопрос. Фил хочет MINIMUM с точностью до 1 цифры после десятичной точки, но больше, если есть ненулевые цифры. – Oddthinking

+1

@Phil: вы можете найти http://stackoverflow.com/questions/2475642/how-to-achieve-the-following-c-output-formatting полезным. – 2010-03-22 02:22:30

+0

Спасибо Роджер. Это очень полезно. Пример вашего форматирования выглядит как правильный путь. –

ответ

0

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

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

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

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

+0

+1, хотя мне до сих пор неясно, чего он хочет, за пределами нуля, точно «0.0». – 2010-03-22 02:29:57

+1

Не более того, Роджер. У меня есть требование, чтобы float или double представлялись в выходном потоке с десятичной точкой, и я просто ищу способ сделать это элегантно, не подразумевая точность точности, которую Oddthinking ссылается выше. Следовательно, 0 должно быть представлено как 0.0, а не 0,0000 ... –

+0

@Phil: Как насчет 0,12, выводится как «0.120000» хорошо? Почему не «0.000000» штраф? (Точно, какое требование не удается?) – 2010-03-22 02:37:22

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

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

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

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

Спасибо Sameer. Однако это предполагает, что я заранее знаю, что d = 0. Существует ли решение для произвольного d, которое будет печатать «0.0», если d = 0, но «0.123456789», если d = 0.123456789? –

+0

@Phil: поток имеет только одну настройку точности. Вы можете проверить значение перед его выводом и вывести свой '' 0.0 "' тогда (обратите внимание, что это строковый литерал, а не двойной). – 2010-03-22 02:19:54

+0

Вы можете сделать что-то вроде этого. cout << setprecision (d?9: 1) << фиксированный << d << endl; – Sameer

 Смежные вопросы

  • Нет связанных вопросов^_^