gcc和Ubuntu上的舍入不正确



我目前正在将一些代码从Windows移植到Linux(Ubuntu(,从MS VS2008编译器移植到GCC。

问题是以下代码有不同的结果:

double            d = 19.53125;
std::cout.precision(4);
std::cout.setf(std::ios::fixed);
std::cout << d << std::endl;
Windows output: 19.5313
Linux output: 19.5312

如果我将精度设置为5,输出是相同的。

我预计19.53125将四舍五入到19.55313。

有什么建议可以让我得到想要的舍入行为吗?

注意:Windows代码在Windows 10笔记本电脑上运行,Linux代码在64位Ubuntu 18.04 LTS VM中运行。

Bankers Rounding是一种将数量舍入为整数的算法,其中与两个最近的整数等距的数字被舍入为最近的偶数。因此,0.5向下舍入为0;1.5次四舍五入到2次。

GCC C++标准库应用Bankers舍入。19.53125->19.5312,因为2是最接近的偶数。

关于C的附加信息,但C++尊重C舍入:与sprintf 的关系的C++舍入行为一致性

这让我大开眼界。感谢所有的链接。由于我还没有找到一种方法来影响printf函数中的舍入行为,因此我看不到使用数学舍入函数的其他解决方案。

以下解决方案仍然适用于我:

double         d = 19.53125;
int precision  p = 4;
double         factor = pow(10.0, p);
std::cout.precision(p);
std::cout.setf(std::ios::fixed);
std::cout << round(d * factor) / factor << std::endl;
Windows output: 19.5313
Linux output: 19.5313

链接:

  1. https://www.exploringbinary.com/inconsistent-rounding-of-printed-floating-point-numbers/
  2. 为什么打印圆形浮点数字

最新更新