小编Ice*_*Hay的帖子

Python 3.x四舍五入

我知道关于python取整的问题已经被问过多次了,但是答案并没有帮助我。我正在寻找一种将浮点数四舍五入并返回浮点数的方法。该方法还应该接受一个参数,该参数定义要舍入的小数位。我写了一种实现这种舍入的方法。但是,我认为它看起来一点也不优雅。

def round_half_up(number, dec_places):
    s = str(number)

    d = decimal.Decimal(s).quantize(
        decimal.Decimal(10) ** -dec_places,
        rounding=decimal.ROUND_HALF_UP)

    return float(d)
Run Code Online (Sandbox Code Playgroud)

我不喜欢它,我必须将float转换为字符串(以避免浮点数不准确),然后再使用十进制模块。您有更好的解决方案吗?

编辑:正如下面的答案中指出的那样,我的问题的解决方案不是那么明显,因为正确的舍入首先需要正确表示数字,而float则不是这种情况。所以我希望下面的代码

def round_half_up(number, dec_places):

    d = decimal.Decimal(number).quantize(
        decimal.Decimal(10) ** -dec_places,
        rounding=decimal.ROUND_HALF_UP)

    return float(d)
Run Code Online (Sandbox Code Playgroud)

(与上面的代码不同,只是将浮点数直接转换为十进制数而不是首先不转换为字符串)在这样使用时返回2.18:round_half_up(2.175, 2)但这不是因为以浮点数的方式Decimal(2.175)返回Decimal('2.17499999999999982236431605997495353221893310546875')数字由计算机表示。出人意料的是,第一个代码返回2.18,因为浮点数先转换为字符串。似乎str()函数对最初要舍入的数字进行了隐式舍入。因此,发生了两次取整。即使这是我所期望的结果,但从技术上讲还是错误的。

python rounding python-3.x

8
推荐指数
1
解决办法
212
查看次数

标签 统计

python ×1

python-3.x ×1

rounding ×1