我在输出浮点数时遇到了一个烦人的问题。当我在 Windows 上以 2 个小数点的精度格式化 11.545 时,它输出“11.55”,正如我所料。但是,当我在 Linux 上执行相同操作时,输出为“11.54”!
我最初在 Python 中遇到了这个问题,但进一步调查表明差异在于底层 C 运行时库。(两种情况下的体系结构都是 x86-x64。)在 Windows 和 Linux 上运行以下 C 行会产生不同的结果,就像在 Python 中一样。
printf("%.2f", 11.545);
为了更清楚地说明这一点,我将数字打印到小数点后 20 位 ( "%.20f"
):
Windows: 11.54500000000000000000
Linux: 11.54499999999999992895
我知道 11.545 不能精确地存储为二进制数。所以看起来正在发生的事情是,Linux 以尽可能高的精度输出它实际存储的数字,而 Windows 输出它的最简单的十进制表示,即。试图猜测用户最有可能的意思。
我的问题是:是否有任何(合理的)方法来模拟 Windows 上的 Linux 行为?
(虽然 Windows 的行为肯定是直观的,但在我的情况下,我实际上需要将 Windows 程序的输出与 Linux 程序的输出进行比较,而 Windows 是我唯一可以改变的。顺便说一下,我试图查看 的 Windows 源代码printf
,但执行 float->string 转换的实际函数是_cfltcvt_l
,并且它的源代码似乎不可用。)
编辑:情节变厚了!关于这是由不精确的表示引起的理论可能是错误的,因为0.125确实具有精确的二进制表示,并且在输出时仍然不同'%.2f' % 0.125
:
Windows: 0.13
Linux: 0.12
但是,round(0.125, 2)
在 Windows 和 Linux 上都返回 0.13。