Win10破坏了printf功能

Win10 broke printf function

#include <stdio.h>
int main()
{
    float f = 1717.7890625;
    printf( "%.6f", f );
    return 0;
}

我用 Visual Studio 19 (16.9.2) 为 x64 arch 编译了这段代码,运行 在我的两台 Windows 10 台电脑上得到了结果:

  1. 版本 1909(OS 内部版本 18363.1440)-> 调试和发布:1717.789063
  2. 版本 2004(OS 内部版本 19041.867)-> 调试:1717.789063 发布:1717.789062

新版本Debug和Release结果不一样的原因是什么?我怎样才能修复它以使两个版本的结果相同?

加法: 代码:

#include <stdio.h>
int main()
{
    double f = 0.25;
    printf( "%.1f", f );
    return 0;
}

在新旧 Win10 版本上具有相同的行为。我建议,这是更新 ucrtbase.dll 版本

中的一个错误

我找到了 windows 版本和 debug/release 模式之间程序如此不同行为的原因。

新的 windows 更新(19041.* 如果我理解正确的话)改变了浮点类型的小数部分的舍入规则:以前它在以 5 结尾的情况下舍入到更大:1.25 -> 1.3,但现在四舍五入到最接近的偶数:1.25 -> 1.21.35 -> 1.4.

要了解新 Win 10 版本的调试和发布之间的区别,需要注意 ucrtbase.dll 使用和更新规则。

  1. 每个应用程序的调试和发布版本使用 ucrtbase.dllucrtbased.dll C:\Windows\System32 或 C:\Windows\SysWOW64
  2. 它是发布版本 (ucrtbase.dll) 是 Windows10 的一部分,只能更新Windows 更新。但它的调试版本 (ucrtbased.dll) 不会随着 Win 10 更新而更新,但可以通过安装更新​​的 Windows 10 SDK 来更新(例如,在 Visual Studio安装程序)。

因此,解决方案是在新的 Windows 10 版本上安装新的 Windows 10 SDK 以实现相同的行为,或者将 printf() 函数切换为 fmt::printf() 函数https://github.com/fmtlib/fmt,例如,使所有 windows 版本的结果相同。