python与浮点数不正确的舍入

sam*_*wei 4 python rounding

>>> a = 0.3135
>>> print("%.3f" % a)
0.314
>>> a = 0.3125
>>> print("%.3f" % a)
0.312
>>>
Run Code Online (Sandbox Code Playgroud)

我期待0.313而不是0.312任何想到为什么会这样,是否有替代方式我可以用来获得0.313?

谢谢

Bak*_*riu 6

根据IEEE 754标准的Python 3轮,使用round-to-even方法.

如果你想以不同的方式进行舍入,那么只需手动实现:

import math
def my_round(n, ndigits):
    part = n * 10 ** ndigits
    delta = part - int(part)
    # always round "away from 0"
    if delta >= 0.5 or -0.5 < delta <= 0:
        part = math.ceil(part)
    else:
        part = math.floor(part)
    return part / (10 ** ndigits)
Run Code Online (Sandbox Code Playgroud)

用法示例:

In [12]: my_round(0.3125, 3)
Out[12]: 0.313
Run Code Online (Sandbox Code Playgroud)

注意:在python2中,舍入总是远离零,而在python3中舍入为偶数.(例如,参见round2.7和3.3之间功能文档的差异).