1
double value; 
std::ostringstream s; 
s << std::fixed << std::setprecision(3) << value; 

Когда value Вандерс в диапазоне -1.0e-14 к 1.0e-14, s мерцает между "0.000" и "-0.000". Есть ли чистый способ подавить знак минуса, который указывает только на неуместный шум в десяти десятичных разрядах дальше?подавить «минус ноль» от соиЬ

(Менее общий случай cout << ....)

what is the best way to avoid negative zero in output? адреса поверхностные проблемы. Его ответ, округляя до нужного числа значащих цифр до, переходя к < <, является большим количеством вычислений по сравнению с «просто отбросьте фриккин» минус, если все цифры равны нулю ».

+0

Это может быть немного лучше с помощью ['setw'] (http://en.cppreference.com/w/cpp/io/manip/setw) (выравнивание по правому краю вывода) или [' showpos'] (http://en.cppreference.com/w/cpp/io/manip/showpos) (показать либо '+', либо '-'). – dyp

+0

Да, 'showpos' мерцает + и - вместо пробела и минуса. Около одного пикселя меньше мерцания :-). –

+0

Есть ли что-то особенно неправильное с 'return (s.str() ==" -0.000 ")? string ("0.000"): s.str(); '? Или это означает признание поражения? В случае 'cout' вам нужно выполнить' cout << fixmydouble (value); '. –

ответ

0

Даже если ничего <iomanip> не может отрегулировать фактический поток, мы, по крайней мере, не можем зависеть от значения, переданного setprecision(), как это:

const std::string& t = s.str(); 
return t.find_first_of("123456789") == t.npos && t[0] == '-' ? 
    t.substr(1) : t; 

Если никаких цифр от 1..9 пока не будут найдены, то все цифры должны быть равны 0.

Если, кроме того, оно начинается с минуса, то пропустите этот символ.

+0

Ничего себе, я просто потерял свою девственность в downvote :-) Есть ли значок для этого? –

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