如何在 python(或 django)中正确舍入小数
How to round up a decimal properly in python(or django)
我试图用下面找到的代码对小数进行四舍五入,但它似乎在 python(django) 中无法正常工作。这是代码:
import math
def round_up(n, decimals=0):
multiplier = 10 ** decimals
return math.ceil(n * multiplier) / multiplier
以下是我在 运行 函数时得到的一些结果:
print(round_up(20.232, 2))
print(round_up(20.211, 2))
print(round_up(20.4, 2))
20.24
20.22
20.4
但是,由于某些原因,我在输入 80.4 时得到了一个奇怪的值。我得到的是 80.41 而不是 80.4:
print(round_up(80.4, 2))
80.41
在 python(django) 中还有其他方法可以对小数进行四舍五入吗?我已经从互联网上得到了这个,所以除了我上面提到的那个(输入 80.4)之外,可能还有其他一些问题。基本上,我只想像上面那样将小数点四舍五入到小数点后第二位(但当然四舍五入 80.4 或 20.3 将分别为 80.4 和 20.3)。谢谢,有什么问题请留下。
浮点数相乘时出现问题
>>> 80.4 * 100
8040.000000000001
所以,math.ceil(80.4 * 100) == 8041
如果你想要精确,你可以使用Decimal
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))
输出
20.24
20
20.4
80.4
此外,您可以创建另一个函数来处理 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))
输出
20.24
20.0
20.4
80.4
我可能误解了你的问题,但据我所知,我想把它写下来以防有帮助。
您是否尝试过 round() 函数已经在 Python 中可用?
round(20.232, 2)
round(20.0, 2)
round(20.4, 2)
round(80.4, 2)
20.23
20.0
20.4
80.4
我再说一遍,我按我的理解回答了,当然,这是一个现成的功能,可能不是你想要的,但如果有帮助,我会很高兴。
我试图用下面找到的代码对小数进行四舍五入,但它似乎在 python(django) 中无法正常工作。这是代码:
import math
def round_up(n, decimals=0):
multiplier = 10 ** decimals
return math.ceil(n * multiplier) / multiplier
以下是我在 运行 函数时得到的一些结果:
print(round_up(20.232, 2))
print(round_up(20.211, 2))
print(round_up(20.4, 2))
20.24
20.22
20.4
但是,由于某些原因,我在输入 80.4 时得到了一个奇怪的值。我得到的是 80.41 而不是 80.4:
print(round_up(80.4, 2))
80.41
在 python(django) 中还有其他方法可以对小数进行四舍五入吗?我已经从互联网上得到了这个,所以除了我上面提到的那个(输入 80.4)之外,可能还有其他一些问题。基本上,我只想像上面那样将小数点四舍五入到小数点后第二位(但当然四舍五入 80.4 或 20.3 将分别为 80.4 和 20.3)。谢谢,有什么问题请留下。
浮点数相乘时出现问题
>>> 80.4 * 100
8040.000000000001
所以,math.ceil(80.4 * 100) == 8041
如果你想要精确,你可以使用Decimal
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))
输出
20.24
20
20.4
80.4
此外,您可以创建另一个函数来处理 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))
输出
20.24
20.0
20.4
80.4
我可能误解了你的问题,但据我所知,我想把它写下来以防有帮助。
您是否尝试过 round() 函数已经在 Python 中可用?
round(20.232, 2)
round(20.0, 2)
round(20.4, 2)
round(80.4, 2)
20.23
20.0
20.4
80.4
我再说一遍,我按我的理解回答了,当然,这是一个现成的功能,可能不是你想要的,但如果有帮助,我会很高兴。