在 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.22
- round_half_up_xx(81.235) => 81.24
如何修改代码使 round_half_up_xx(81.225) 产生 81.23?
不能,因为 81.225
不是 IEEE 754 二进制浮点数中的实际值。它是 81.2249999999999943...
的 shorthand,因为它没有以千分之一的 5
结尾,所以四舍五入到 81.22
而无需考虑特殊的舍入规则。
如果你想要这种真正的准确性,你需要使用 the decimal
module,用 int
s 或 str
初始化 decimal.Decimal
值(如果你使用 float
初始化,它将尽可能准确地反映 float
的精度,因此它也不会是 81.225
)。通过小数精度,它可以使用您喜欢的任何舍入策略进行小数舍入,而无需像您在此处所做的那样从头开始重新实现它。
我正在使用此函数将 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.22
- round_half_up_xx(81.235) => 81.24
如何修改代码使 round_half_up_xx(81.225) 产生 81.23?
不能,因为 81.225
不是 IEEE 754 二进制浮点数中的实际值。它是 81.2249999999999943...
的 shorthand,因为它没有以千分之一的 5
结尾,所以四舍五入到 81.22
而无需考虑特殊的舍入规则。
如果你想要这种真正的准确性,你需要使用 the decimal
module,用 int
s 或 str
初始化 decimal.Decimal
值(如果你使用 float
初始化,它将尽可能准确地反映 float
的精度,因此它也不会是 81.225
)。通过小数精度,它可以使用您喜欢的任何舍入策略进行小数舍入,而无需像您在此处所做的那样从头开始重新实现它。