我在输出浮点数时遇到了一个恼人的问题.当我在Windows上格式化11.545,精度为2小数点时,它输出"11.55",正如我所料.但是,当我在Linux上做同样的事情时,输出是"11.54"!
我最初在Python中遇到了这个问题,但进一步的调查表明,差异在于底层的C运行时库.(该体系结构是x86的64在两种情况下.)运行C的下面的行上产生Windows和Linux的不同的结果,同样因为它在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.