为什么输出精度不能正确舍入?

时间:2020-02-12 21:26:08

标签: c++ precision

我测试了以下代码,以验证在C ++中使用std::setprecision时一些简单的数字输出:

double f1 = 3.1415;
std::cout << std::setprecision(4) << f1 << '\n';
double f2 = 1.2345;
std::cout << std::setprecision(4) << f2 << '\n';

相应的输出为:

3.142
1.234

为什么不能将1.234舍入为1.235?此外,如果将f2更改为1.2315,则输出会发生舍入,输出为1.232。使用setprecision格式化数字输出的格式时,有什么经验法则吗?

1 个答案:

答案 0 :(得分:1)

此评论告诉您原因。我强烈建议您阅读https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

为了进行正确的舍入,C ++附带了round(),但它仅舍入为整数,而不是任意的小数位。以下内容可以为您提供1.235,尽管有点难看:

double f1 = 3.1415;
std::cout << std::setprecision(4) << round(f1*1000)/1000 << '\n';
double f2 = 1.2345;
std::cout << std::setprecision(4) << round(f2*1000)/1000 << '\n';