我正在尝试将Cpp中的平均值打印到float
num的2个小数点。 avg
为float
,sum
为float
,count
为int
。
目前,如果我有10/1,例如它输出10.00。我希望输出只有10.如果avg
获得值3.1467665
,例如,它应显示为3.14
。
avg = sum/count;
std::cout << std::fixed << std::setprecision(2) << avg;
舍入应仅适用于输出。无需更改avg
,但如果更容易,则可以更改其值。
在c ++ 11之前寻找使用标准的解决方案。
UPD :当我希望它为27.5时,输出为27.50。
答案 0 :(得分:3)
您可以根据avg
值的浮动模数选择精度。以下作品:
int main() {
double sum = 10;
double count = 3;
double avg = sum/count;
double mod;
std::cout << std::fixed
<< std::setprecision((modf(avg, &mod) != 0.0) ? 2 : 0)
<< avg
<< std::endl;
}
考虑增加的规格:
以下是使用@IInspectable的建议方法的可能实现:
std::stringstream ss;
ss << std::fixed << avg;
size_t pos = ss.str().find('.');
if (pos + 2 < ss.str().size()) // If there is a '.' and more than 2 digits after it
pos += 3;
std::string s = ss.str().substr(0, pos); // Leave only two digits
s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) { return ch != '0'; }).base(), s.end()); // Remove trailing zeros
s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) { return ch != '.'; }).base(), s.end()); // Remove trailing '.' when needed
std::cout << s << std::endl;
这将输出:
10/4 -> 2.5
10/3 -> 3.33
10/2 -> 5
10/7 -> 1.42
3.9999 -> 3.99