【发布时间】:2015-11-06 19:29:24
【问题描述】:
我的情况是:
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.... 这就是我输入初始 cout 的原因,所以我可以看到传入的“真实”值。std::cout 是否舍入值在它显示它们之前?我怎么能看到传入的“真实”值?
【问题讨论】:
-
我的错,
round总是从零四舍五入。使用std::setprecision,或打印为hexfloat。 -
std::round() 的定义不是从零舍入吗?有没有办法改变“舍入模式”?
-
你是对的(我将问题误读为
foo(3.125)打印 3.12),然后没有查找std::round,因为对该行为的唯一合理解释是四舍五入)跨度> -
有谁知道 std::cout 在显示数字之前可能会在哪里记录?我想了解确切的规则。
-
事实证明我的猜测是正确的。使用
std::precision(25)时,我注意到这个数字确实比 0.5 舍入限制小一点:3.1249999999999995559107901。
标签: c++ c++11 double rounding gcc5.2