Python舍入问题

Joh*_*ang 10 python rounding

我在python中遇到了一个非常奇怪的问题.(使用python 2.4.x)

在Windows中:

>>> a = 2292.5
>>> print '%.0f' % a
2293
Run Code Online (Sandbox Code Playgroud)

但是在Solaris中:

>>> a = 2292.5
>>> print '%.0f' % a
2292
Run Code Online (Sandbox Code Playgroud)

但是在windows和solaris中都是一样的:

>>> a = 1.5
>>> print '%.0f' % a
2
Run Code Online (Sandbox Code Playgroud)

有人可以解释这种行为吗?我猜它的平台依赖于编译python的方式?

Ale*_*lli 10

最终负责执行格式化的功能是PyOS_snprintf (参见来源).正如你猜测,这是不幸的是取决于系统,也就是说,它依赖于vsprintf,vsnprintf或最终由该平台的C运行时库提供的其他类似的功能(如果C标准说关于"%F"格式化什么我不记得在两个可能的舍入值之间"正好位于中间"的浮点数...但是,C标准是否对此不严格,或者更确切地说C标准是严格的,但是一些C运行时打破它,最终是一个相当学术问题...) .

  • 我相信一些实现(C)在前一个数字是偶数时向下舍入,在奇数时向上舍入 (3认同)
  • 我认为C标准要求使用ISO 754,但指定了几个可能的舍入模式(可能以免破坏现有的FPU四舍五入的硬件),其中两个是"圆甚至"(glibc的)和"圆远离0"(视窗CRT).请参见http://en.wikipedia.org/wiki/Floating_point#Rounding_modes."圆到均匀"是奇怪而毫无意义的,但它是合法的,我们坚持下去. (2认同)
  • 这并不奇怪,毫无意义.该规则意味着平均所有舍入均匀. (2认同)