在 Python 中向上舍入浮动的千分之一位 5s [重复]

Round up floating thousandth place 5s up in Python [duplicate]

提问人:sung 提问时间:11/13/2019 更新时间:11/13/2019 访问量:112

问:

我正在使用这个函数在 Python 中四舍五入浮动 5s:

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?

Python 舍入 浮动精度

评论

0赞 accdias 11/13/2019
看一下 Decimal 模块。它已经按照您想要的方式实现了舍入函数。从那里“四舍五入选项包括ROUND_CEILING、ROUND_DOWN、ROUND_FLOOR、ROUND_HALF_DOWN、ROUND_HALF_EVEN、ROUND_HALF_UP、ROUND_UP和ROUND_05UP。
3赞 ShadowRanger 11/13/2019
@KentShikama:这里的问题不在于庄家的四舍五入/半圆偶数,而是浮点不精确性使所有半圆策略都无关紧要。我已重定向到解决该特定问题的问题。
0赞 11/13/2019
math.ceil(n*100)/100
3赞 ShadowRanger 11/13/2019
@JustinEzequiel:这是无条件的四舍五入,而不是四舍五入 将四舍五入到您的方法下,当他们只想(和更高)四舍五入到 ,而下面的任何数字四舍五入到 。81.22000000000181.2381.22581.2381.22581.22
0赞 11/13/2019
@ShadowRanger,我错过了减半的部分。我纠正了。

答:

2赞 ShadowRanger 11/13/2019 #1

你不能,因为 IEEE 754 二进制浮点数中不是实际值。它是 的简写,因为它不以千分之一结尾,因此四舍五入而不涉及特殊的四舍五入规则。81.22581.2249999999999943...581.22

如果你想要这种真正的精度,你需要使用decimal模块,用s或初始化值(如果你用,它将尽可能地准确地反映的精度,所以它也不会)。凭借十进制精度,它可以使用您喜欢的任何舍入策略进行十进制舍入,而无需像您在此处所做的那样从头开始重新实现它。decimal.Decimalintstrfloatfloat81.225