【问题标题】:How to round up a decimal properly in python(or django)如何在python(或django)中正确舍入小数
【发布时间】:2021-12-27 15:41:10
【问题描述】:

我试图用我在下面找到的代码将小数四舍五入,但它似乎在 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)。谢谢,如有任何问题,请留下。

【问题讨论】:

  • 这能回答你的问题吗? How to round to 2 decimals with Python?
  • 不完全是。该链接用于round()。我正在尝试四舍五入。
  • 您的问题来自浮点错误。试试 print(80.4 * (10 ** 2)) 看看为什么这不起作用。
  • @DanielP 你能把代码写成 print(round_up(decimal, number)) 格式吗?如果可能的话,如果您能编写完整的功能代码,我将不胜感激。

标签: python python-3.x django django-models django-views


【解决方案1】:

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

>>> 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

【讨论】:

  • 感谢您的明确答复。但是,我可以问一下小数和浮点数之间的区别吗?我应该使用哪一个?
  • @codebuilder 十进制存储您的号码“原样”,尊重所有数字。当您在80.4 * 100 == 8040.000000000001 获得时,float 可以稍微改变您的数字。小数有点慢,并且需要比浮点更复杂的语法。因此,如果您存储钱或需要精确的东西,我认为您应该使用小数。如果您存储距离或体积,您可以使用浮点数。但请注意您遇到的舍入错误。
【解决方案2】:

我可能误解了你的问题,但据我了解,我想写下它以防万一。


您是否尝试过 Python 中已有的 round() 函数?

round(20.232, 2)
round(20.0, 2)
round(20.4, 2)
round(80.4, 2)

20.23
20.0
20.4
80.4

我再说一遍,我就我理解的回答了,当然,这是现成的功能,可能不是你想要的,但如果有帮助,我会很高兴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多