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