在round()函数中构建的Python在2.4和2.7之间的变化

Pau*_*son 4 python floating-point floating-accuracy python-2.4 python-2.7

Python中内置的round()函数是否在2.4和2.7之间变化?

Python 2.4:

Python 2.4.6 (#1, Feb 12 2009, 14:52:44)
[GCC 3.4.6 20060404 (Red Hat 3.4.6-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = 1480.39499999999998181010596454143524169921875
>>> round(f,2)
1480.4000000000001
>>>
Run Code Online (Sandbox Code Playgroud)

Python 2.7:

Python 2.7.1 (r271:86832, May 13 2011, 08:14:41)
[GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = 1480.39499999999998181010596454143524169921875
>>> round(f, 2)
1480.39
>>>
Run Code Online (Sandbox Code Playgroud)

反正有没有得到Python 2.4的行为?

我知道正确的答案当然是使用十进制算术模块.不幸的是,考虑到时间限制,这可能不是一个选择.

更新

对于上下文,我正在比较两个系统中的值,其中一个使用十进制表示,另一个使用浮点表示.这可能(或可能不是)需要进一步检查的系统之间的合法差异,因此我将咨询用户并在"报告"级别处理它,而不是在我从系统获取数据的时候.

谢谢你的帮助!

Joh*_*n Y 6

你的第一个问题的答案是:是的,round已在Python 2.7中修复.

你的第二个问题的答案是:我不确定,实际上没有使用早期的Python(2.6应该仍然表现出2.4的行为).在这种特殊情况下,你的价值与1480.395和1480.395(对我们基数为10人)无法区分,为1480.40.所以我想你可以尝试首先四舍五入到一个超出你真正追求的地方,把它变成一个字符串,然后从那里得到一个十进制...但对不起,我想不出任何不涉及十进制的东西.如果我想到某些事情(在别人发布更好的事情之前),我会回来编辑.

(但实际上,十进制是难以使用的吗?)

编辑: 以下是如何使用Decimal的示例:

>>> from decimal import Decimal
>>> f = Decimal('1480.395')
>>> f.quantize(Decimal('0.00'))
Decimal('1480.40')
>>> float(Decimal('1480.40'))
1480.4
Run Code Online (Sandbox Code Playgroud)

一些说明:

Python 2.7允许您使用浮点数作为Decimal的输入. 不要这样做,因为你会回到你开始的地方.另外,不要在roundDecimal上使用内置函数,因为该函数将把你的De​​cimal转换回float,因此你会回到你开始的地方.在最简单的形式中,Decimal quantize采用另一个具有您真正想要的小数位数的Decimal(将其视为舍入的模板).如果您的数据绝对必须是浮点数,那么只有在完成所有Decimal计算后才转换回float.

最后:我不确定这是否涵盖了Python 2.4浮动行为中所有可能的奇怪角落情况.如果你是依靠准确的Python 2.4的行为,有可能是没有替代品的Python 2.4中运行.我上面所描述的仅仅是人类四舍五入的一步.