2015-11-06 67 views
0

我有一个情况:我怎样才能得到一个双精度值?

void foo(const double d) 
{ 
    const double rounded_2_decimals = std::round(d*100.0)/100.0; 
    std::cout << "d=" << d << std::endl; 
    std::cout << "r=" << rounded_2_decimals << std::endl; 
} 

打印时,d=3.125,但r=3.12而不是r=3.13

我怀疑是因为d传递的其实是3.1249999 ....这就是为什么我把最初的清点,所以我可以看到在传递的“真”值。它显示之前是否std::cout一轮值他们?我还有什么可以看到通过的“真实”价值?

+0

我的坏,'round'总是舍入远离零。使用'std :: setprecision',或者打印为hexfloat。 –

+0

std :: round()的定义不是从零开始?有没有办法改变“舍入模式”? –

+0

你是对的(我错误的问题是'foo(3.125)'printing 3.12),然后没有查找'std :: round',因为对于这种行为的唯一可能的解释是四舍五入到偶数) –

回答

2

是的,std::cout确实是舍入值,但是您可以设置更高的精度。首先包含iomanip标题。然后:

void foo(const double d) 
{ 
    const double rounded_2_decimals = std::round(d*100.0)/100.0; 
    std::cout << "d=" << std::setprecision(9) << d << std::endl; 
    std::cout << "r=" << std::setprecision(9) << rounded_2_decimals << std::endl; 
} 

活生生的例子程序here

+0

诀窍是将std :: setprecision(9)与std :: fixed结合使用。 –

+0

'std :: fixed'不需要获取“真实”值,因为'std :: precision'足以提供更高的精度,指定覆盖小数点两侧的最大位数。结果会忽略小于指定的最大位数的尾随零。但是,如果你想要特定的格式,例如小数点后的固定数字位数,或者想要指定小数点后数字位数的精度,那么是的,你可以将它与'std :: fixed'结合使用 – ccoder83

+0

谢谢,ccoder83。尾随零的截断使我走错了路。增加'std :: setprecision()'中的值最终向我展示了我所怀疑的事实,即该值仅仅是小于0.5的头发。 –