Python舍入问题

时间:2010-02-01 00:51:23

标签: python rounding

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

在Windows中:

>>> a = 2292.5
>>> print '%.0f' % a
2293

但在Solaris中:

>>> a = 2292.5
>>> print '%.0f' % a
2292

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

>>> a = 1.5
>>> print '%.0f' % a
2

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

3 个答案:

答案 0 :(得分:10)

最终负责执行格式化的功能是PyOS_snprintf (见the sources)。正如你猜测的那样,遗憾的是系统依赖于它,即它依赖于vsprintfvsnprintf或其他类似的函数,这些函数最终由平台的C运行时库提供(我不记得是否符合C标准)对于两个可能的舍入值之间“正好中间”的浮点数的'%f'格式说了什么......但是,C标准是否对此松散,或者说C标准是严格的,但有些C运行时会破坏它,最终是一个相当严重的学术问题......)。

答案 1 :(得分:2)

round()向最接近的偶数整数舍入 “%n.nf”与round()的工作方式相同 int()截断为零

“将正数四舍五入到最接近的整数
可以通过添加0.5并截断“
来实现 - http://en.wikipedia.org/wiki/Rounding

在Python中,您可以执行以下操作:math.trunc( n + 0.5 )
假设n当然是肯定的......

如果“圆半到均匀”不合适,我现在使用
math.trunc( n + 0.5 )我过去常常使用int(round(n))

答案 2 :(得分:0)

我依赖于平台。您可以找到文档here

当您知道自己想要的内容(向上或向下)时,最好是用户ceilfloor