如何在 python(或 django)中正确舍入小数

cod*_*der 1 python django django-models django-views python-3.x

我试图用下面找到的代码对小数进行四舍五入,但它似乎在 python(django) 中无法正常工作。这是代码:

import math
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier
Run Code Online (Sandbox Code Playgroud)

以下是我运行该函数时得到的一些结果:

print(round_up(20.232, 2))
print(round_up(20.211, 2))
print(round_up(20.4, 2))

20.24
20.22
20.4
Run Code Online (Sandbox Code Playgroud)

然而,由于某种原因,当我输入 80.4 时,我得到了一个奇怪的值。我得到的是 80.41 而不是 80.4:

print(round_up(80.4, 2))
80.41
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以在 python(django) 中四舍五入小数?我已经从网上得到了这个,所以除了我上面提到的问题(输入80.4)之外,可能还有其他一些问题。基本上,我只想像上面那样将小数四舍五入到第二个小数点(但当然,四舍五入 80.4 或 20.3 分别只是 80.4 和 20.3)。谢谢您,如有任何问题请留下。

Eug*_*nij 5

当您乘以浮点数时会出现问题

>>> 80.4 * 100
8040.000000000001
Run Code Online (Sandbox Code Playgroud)

所以,math.ceil(80.4 * 100) == 8041

如果你想精确,你可以使用十进制

from decimal import Decimal, ROUND_CEILING

def round_up_decimal(n, decimals=0):
    multiplier = Decimal(10 ** decimals)
    return (n * multiplier).to_integral(rounding=ROUND_CEILING) / multiplier

print(round_up_decimal(Decimal("20.232"), 2))
print(round_up_decimal(Decimal("20.0"), 2))
print(round_up_decimal(Decimal("20.4"), 2))

print(round_up_decimal(Decimal("80.4"), 2))
Run Code Online (Sandbox Code Playgroud)

输出

20.24
20
20.4
80.4
Run Code Online (Sandbox Code Playgroud)

另外,您可以创建另一个函数来使用 float

def round_up_float(n, decimals=0):
    return float(round_up_decimal(Decimal(str(n)), decimals)) # uses previous function


print(round_up_float(20.232, 2))
print(round_up_float(20.0, 2))
print(round_up_float(20.4, 2))

print(round_up_float(80.4, 2))
Run Code Online (Sandbox Code Playgroud)

输出

20.24
20.0
20.4
80.4
Run Code Online (Sandbox Code Playgroud)