如何解决在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.5313。
有什么建议可以使我获得所需的舍入行为?
注意:Windows代码在Windows 10便携式计算机上运行,而Linux代码在64位Ubuntu 18.04 LTS VM内运行。
解决方法
银行家舍入法是一种将数量舍入为整数的算法,其中将与两个最接近的整数等距的数字舍入为最接近的偶数整数。因此,0.5向下舍入为0;否则,向下舍入为0。 1.5向上舍入为2。
GCC C ++标准库应用银行取整。 19.53125-> 19.5312,因为2是最接近的偶数位。
有关C的其他信息,但C ++尊重C舍入:C++ Rounding behavior consistency for ties with sprintf
,这让我大开眼界。感谢所有的链接。 由于无法在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
链接:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。