3 回答
TA贡献1789条经验 获得超10个赞
8.833333333339(或8.833333333333334的结果106.00/12)正确舍入为小数点后两位8.83。从数学上来说,这听起来像是您想要的天花板功能。Python math模块中的一个名为ceil:
import math
v = 8.8333333333333339
print(math.ceil(v*100)/100) # -> 8.84
地板和天花板函数通常分别将实数映射到小数位数为零的最大的前一个或最小的后整数–因此,将它们用于2个小数位,首先将数字乘以10 2(或100)即可将小数点后移点,然后除以它以进行补偿。
如果math由于某种原因不想使用该模块,则可以使用我刚刚编写的这个(经过最低测试的)实现:
def ceiling(x):
n = int(x)
return n if n-1 < x <= n else n+1
这如何适用于链接的贷款和付款计算器问题
从样本输出中可以看出,他们对每月付款进行了四舍五入,这就是许多人所说的上限功能的效果。这意味着每个月略多于1 / 12的总量被支付。这样一来,末期付款就比平时少了一点,因此剩余的未付余额仅为8.76。
使用正常的四舍五入产生每月付款8.83和稍高的最终付款同样有效8.87。但是,在现实世界中,人们通常不希望增加自己的付款,因此对每笔付款进行四舍五入是常见的做法-还会更快地将钱退还给贷方。
TA贡献1773条经验 获得超3个赞
这是正常现象(与Python无关),因为8.83不能完全表示为二进制浮点数,就像1/3不能完全以十进制表示(0.333333 ... ad infinitum)一样。
如果要确保绝对精度,则需要以下decimal模块:
>>> import decimal
>>> a = decimal.Decimal("8.833333333339")
>>> print(round(a,2))
8.83
TA贡献1874条经验 获得超12个赞
您想使用十进制模块,但还需要指定舍入模式。这是一个例子:
>>> 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')
>>>
添加回答
举报