在流式传输到std输出时,我可以指定setprecision来舍入double值吗?
ofile << std::setprecision(12) << total_run_time/TIME << "\n";
输出: 0.756247615801
ofile << std::setprecision(6)<< total_run_time/TIME << "\n";
输出: 0.756248
但我需要输出为0.756247
由于
答案 0 :(得分:14)
std::fesetround
还有<cfenv>
,它设置了舍入方向:
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cfenv>
int main () {
double runtime = 0.756247615801;
// Set rounding direction and output with some precision:
const auto prev_round = std::fegetround();
std::fesetround(FE_DOWNWARD);
std::cout << "desired: " << std::setprecision(6) << runtime << "\n";
// Restore previous rounding direction and output for testing:
std::fesetround(prev_round);
std::cout << "default: " << std::setprecision(6) << runtime << "\n";
}
(请注意,这些不是我推荐的评论,它们仅用于辅导目的)
输出:
desired: 0.756247
default: 0.756248
重要说明:我没有在标准中找到任何提及,浮动类型的operator<<
重载具有以遵循舍入方向。
答案 1 :(得分:2)
将除法的结果乘以一百万,转换为整数,除以一百万(作为双精度)。产生输出不需要std::setprecision
的副作用。
答案 2 :(得分:2)
另一种方法是通过在输出第二个案例中从double
减去0.000005来打败舍入:
total_run_time / TIME - 0.000005
在很多方面我更喜欢这个,因为它避免了整数溢出的可能性。
答案 3 :(得分:1)
std::cout.write(std::to_string(0.756247615801).c_str(), 8);
它看起来很脏,但它有效!