假设我有8.8333333333333339
,我想将其转换为8.84
。如何在Python中完成此操作?
round(8.8333333333333339, 2)
给与8.83
不8.84
。我是Python或一般编程的新手。
我不想将其打印为字符串,结果将被进一步使用。有关此问题的更多信息,请查看Tim Wilson的Python编程技巧:贷款和付款计算器。
假设我有8.8333333333333339
,我想将其转换为8.84
。如何在Python中完成此操作?
round(8.8333333333333339, 2)
给与8.83
不8.84
。我是Python或一般编程的新手。
我不想将其打印为字符串,结果将被进一步使用。有关此问题的更多信息,请查看Tim Wilson的Python编程技巧:贷款和付款计算器。
Answers:
8.833333333339
(或8.833333333333334
的结果106.00/12
)正确舍入为小数点后两位8.83
。数学上,这听起来像您想要的是天花板功能。Pythonmath
模块中的一个名为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
。但是,在现实世界中,人们通常不希望增加自己的付款,因此对每笔付款进行四舍五入是常见的做法-还会更快地将钱退还给贷方。
如果将8.8333333333339舍入到两位小数,则正确答案是8.83,而不是8.84。之所以得到8.83000000001,是因为8.83是不能正确以二进制表示的数字,它为您提供了最接近的数字。如果要不带全零打印,请按照VGE的说明进行操作:
print "%.2f" % 8.833333333339 #(Replace number with the variable?)
这是我针对上舍入/下舍入问题的解决方案
< .5 round down
> = .5 round up
import math
def _should_round_down(val: float):
if val < 0:
return ((val * -1) % 1) < 0.5
return (val % 1) < 0.5
def _round(val: float, ndigits=0):
if ndigits > 0:
val *= 10 ** (ndigits - 1)
is_positive = val > 0
tmp_val = val
if not is_positive:
tmp_val *= -1
rounded_value = math.floor(tmp_val) if _should_round_down(val) else math.ceil(tmp_val)
if not is_positive:
rounded_value *= -1
if ndigits > 0:
rounded_value /= 10 ** (ndigits - 1)
return rounded_value
# test
# nr = 12.2548
# for digit in range(0, 4):
# print("{} decimals : {} -> {}".format(digit, nr, _round(nr, digit)))
# output
# 0 decimals : 12.2548 -> 12
# 1 decimals : 12.2548 -> 12.0
# 2 decimals : 12.2548 -> 12.3
# 3 decimals : 12.2548 -> 12.25
使用decimal
模块:http : //docs.python.org/library/decimal.html
ََََََ
这是为您执行此操作的简单功能:
def precision(num,x):
return "{0:.xf}".format(round(num))
此处,num是十进制数。x是要舍入到浮点数的十进制数。
与其他实现相比的优势在于,它可以在小数点的右端填充零,以使deciaml数字最多x个小数位。
范例1:
precision(10.2, 9)
将返回
10.200000000(最多9个小数点)
范例2:
precision(10.2231, 2)
将返回
10.22(最多两个小数点)