如何将浮点数四舍五入到某个小数位?

2020-12-04 15:54:04 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有8.8333333333333339,我想把它转换成8.84。我怎样才能用Python完成这个任务?

round(8.8333333333333339, 2)给出8.83,而不是8.84。我对Python或一般编程还不熟悉。

我不想将其打印为字符串,结果将被进一步使用。有关此问题的详细信息,请检查Tim Wilson's Python Programming Tips: Loan and payment calculator

3条回答
网友
1楼 ·

This is normal(与Python无关),因为8.83不能完全表示为二进制浮点数,正如1/3不能完全表示为十进制(0.333333。。。无限期)。

如果要确保绝对精度,则需要^{}模块:

>>> import decimal
>>> a = decimal.Decimal("8.833333333339")
>>> print(round(a,2))
8.83
网友
2楼 ·

8.833333333339(或8.833333333333334,结果106.00/12)适当四舍五入到小数点后两位是8.83。从数学上讲,听起来你想要的是一个ceiling function。Python的math模块中的一个名为^{}

import math

v = 8.8333333333333339
print(math.ceil(v*100)/100)  # -> 8.84

下限和上限函数通常将实数映射到小数点为零的最大前一个或最小后一个整数-因此,要将它们用于两个小数点,数字首先乘以102(或100)以移动小数点,然后除以它进行补偿。

如果出于某种原因不想使用math模块,可以使用我刚才编写的(经过最低测试的)实现:

def ceiling(x):
    n = int(x)
    return n if n-1 < x <= n else n+1

这如何应用于链接的loan and payment calculator problem

screenshot of loan calculator output

从样本输出来看,它们似乎将每月的付款四舍五入,这就是许多人所说的上限函数的效果。这意味着每个月支付的总金额略高于1/sub>12。这使得最后的付款比平时少了一点——剩下的未付余额只有8.76

使用正常的四舍五入来产生每月支付的8.83和稍高的最终支付8.87是同样有效的。然而,在现实世界中,人们通常不喜欢让他们的付款增加,所以将每笔付款加起来是一种常见的做法——它还可以更快地将钱返还给贷款人。

网友
3楼 ·

要使用十进制模块,但还需要指定舍入模式。下面是一个例子:

>>> import decimal
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_UP)
Decimal('8.34')
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)
Decimal('8.33')
>>> 

相关问题