【发布时间】:2015-09-17 12:07:48
【问题描述】:
我有一个可以在 Windows/Linux 上运行的 C++ 程序。在 Windows 上,程序使用 Visual Studio 2012 编译,Linux 使用 GCC 编译。使用 sprintf 将双精度数转换为字符串时,Visual Studio 使用的舍入方法与 GCC 编译器不同 - 即以 5 结尾的小数。
Visual Studio 编译器似乎执行 round half away from zero,而 GCC 执行 round even 又名银行家四舍五入。
四舍五入是期望的行为。
是否可以更改 Visual Studio / Windows 中用于 sprintf 格式字符串的舍入行为?因为我需要使两者之间的舍入行为一致。
这是一个小示例 C++ 程序,它说明了上述行为:
int main()
{
char buffer[100];
double x;
for (x = -0.5; x <= 10.5; x += 1.0)
{
sprintf(buffer,"%4g %.0f\n", x, x);
std::cout << buffer;
}
return 0;
}
Windows 输出。数字从零开始四舍五入:
使用 xCode 编译的 OSX 输出。数字使用 round even 向偶数四舍五入:
OSX 输出:
【问题讨论】:
-
您可能想查看这篇文章及其 cmets:exploringbinary.com/…
-
您始终可以使用自己的 {*}printf 函数
标签: c++ visual-studio gcc printf