Python 四舍五入问题

10 投票
3 回答
1890 浏览
提问于 2025-04-15 18:43

我遇到了一个很奇怪的问题,使用的是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

这个是和平台有关的。你可以在这里找到相关的文档。

当你知道自己想要什么(是向上取整还是向下取整)时,使用ceilfloor会比较好。

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))

10

负责执行格式化的函数是 PyOS_snprintf (你可以查看 源代码)。正如你所猜测的,这个函数实际上是依赖于系统的,也就是说,它需要用到 vsprintfvsnprintf 或其他类似的函数,这些函数是由你使用的操作系统的C语言运行库提供的。我不太记得C语言标准是否对浮点数的'%f'格式化有特别的规定,尤其是当浮点数正好在两个可能的四舍五入值之间时……不过,不管C标准是比较宽松,还是说标准严格但某些C运行库没有遵守,这个问题其实都比较学术化……

撰写回答