2016-01-05 2 views
4

В зависимости от того, какой компилятор я использую, я получаю отличный вывод для этой функции при n = 0.Правильное поведение для std :: setprecision (0) в GCC vs VS2013

std::string ToStrWPrec(double a_value, const int n) 
{ 
    std::ostringstream out; 
    out << std::setprecision(n) << a_value; 
    return out.str(); 
} 

(GCC) 4.8.3 20140911 (Red Hat 4.8.3-9) возвращает 1 для ToStrWPrec (1.2345678,0). VS2013 возвращает 1.2346 для того же кода.

мой вопрос являются:

  1. Что такое правильное/стандартное поведение для setprecision?
  2. Что было бы хорошей альтернативой использованию setprecision?

здесь обновленный код, основанный на комментарий ниже

std::string ToStrWPrec(double a_value, const int n) 
{ 
    std::ostringstream out; 
    out << std::setprecision(n) << std::fixed<< a_value; 
    return out.str(); 
} 
+1

Чтобы получить воспроизводимый результат, вы должны [использовать std :: fixed] (http://www.cplusplus.com/reference/ios/fixed/). MSVC++ предполагает std :: scientific, если ни один не указан. –

+0

Это фактически решило мою проблему и обеспечило согласованный результат между GCC и VS2013. – Payman

ответ

2

Согласно 22.4.2.2.2 [facet.num.put.virtuals] пункта 5, Этап 1, это говорит о точности:

Для преобразования из типа с плавающей точкой, если floatfield != (ios_base::fixed | ios_base::scientific), str.precision() указан как точность в спецификации преобразования. В противном случае точность не указана.

Этот же параграф указывает в другом месте, что спецификатор формата, определяющий результат, равен %g.

Значение по умолчанию для floatfield ничего не установлено в соответствии с 27.5.5.2 [basic.ios.cons] пункта 3, Таблица 128:

flags()skipws | dec

Таким образом, она сводится как форматная строка "%.0g" форматирует значение. Стандарт С в пункте 7.21.6.1 8 гласит: это

Пусть P равна точности, если ненулевой, 6, если точность опущен, или 1, если точность равна нулю.

Кажется, правильный результат 1.

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