#include <stdio.h>
int main()
{
float f = 1717.7890625;
printf( "%.6f", f );
return 0;
}
我使用 Visual Studio 19 (16.9.2) 为 x64 arch 编译了这段代码,并在我的两台 Windows 10 PC 上运行了结果:1717.789063
1717.789063
发布:1717.789062
新版本Debug和Release结果不一样的原因是什么?如何修复它以使两个版本的结果相同?
添加:
编码:
#include <stdio.h>
int main()
{
double f = 0.25;
printf( "%.1f", f );
return 0;
}
在新的和旧的 Win10 版本上有相同的行为。我建议,这是较新的 ucrtbase.dll 版本中的错误
最佳答案
我发现了 Windows 版本和调试/ Release模式之间程序行为如此不同的原因。
新的 Windows 更新(19041.* 如果我理解正确的话)更改了浮点类型小数部分的舍入规则:以前它在以 5 结尾的情况下舍入为更大:1.25 -> 1.3
,但现在它四舍五入到最接近的偶数:1.25 -> 1.2
, 1.35 -> 1.4
.
要了解新 Win 10 版本上调试和发布之间的区别,需要注意 ucrtbase.dll 使用和更新规则。
因此,解决方案是在新的 Windows 10 版本上安装新的 Windows 10 SDK 以实现相同的行为或将 printf() 函数从 https://github.com/fmtlib/fmt 切换为 fmt::printf() 函数。 ,例如,使结果在所有 Windows 版本上都相同。
关于c - Win10破解了printf函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66750222/