在 Python 中向上舍入浮动千位 5s

Round up floating thousandth place 5s up in Python

我正在使用此函数将 Python 中的浮动 5 取整:

def round_half_up_xx(n, decimals=2):
    multiplier = 10 ** decimals
    return math.floor(n*multiplier + 0.5) / multiplier

我得到了奇怪的结果:

如何修改代码使 round_half_up_xx(81.225) 产生 81.23?

不能,因为 81.225 不是 IEEE 754 二进制浮点数中的实际值。它是 81.2249999999999943... 的 shorthand,因为它没有以千分之一的 5 结尾,所以四舍五入到 81.22 而无需考虑特殊的舍入规则。

如果你想要这种真正的准确性,你需要使用 the decimal module,用 ints 或 str 初始化 decimal.Decimal 值(如果你使用 float 初始化,它将尽可能准确地反映 float 的精度,因此它也不会是 81.225)。通过小数精度,它可以使用您喜欢的任何舍入策略进行小数舍入,而无需像您在此处所做的那样从头开始重新实现它。