如何在for循环中将整数浮动到最后一个小数

时间:2016-12-30 04:08:16

标签: python for-loop floating-point decimal

我正在编写一个包含两个参数的代码,即初始数量和转换为小数的速率。我所要做的就是使用for循环来查找初始数量增长一定速率10年的速率。

def bankInterest(iniBalance, rate):
   rate = (int(rate)*(.01))
   list = [1,2,3,4,5,6,7,8,9,10]
   for x in list:
      iniBalance = format((int(iniBalance) + (int(iniBalance)* rate)),'.4f')
   print (iniBalance)

它是正确的方法。问题是,当我使用参数(100,10)时,我得到的答案是256.3,我想要得到的答案是259.37并且手动执行该功能,我知道我输了数字因为我的for循环只转到第一个小数。我尝试过使用格式(x,' .2f')我尝试过使用float,但我无法弄清楚如何使用完整小数制作四个循环号。

2 个答案:

答案 0 :(得分:1)

解决方案

我删除了所有不需要的东西:

def bankInterest(iniBalance, rate):
    rate = rate * 0.01
    for x in range(1, 11):
        iniBalance += iniBalance * rate
    print('{:.2f}'.format(iniBalance))

bankInterest(100, 10)

输出看起来不错:

259.37

您不需要一次又一次地将相同的号码投射到int。而不是list = [1,2,3,4,5,6,7,8,9,10]只使用range(1, 11)list是内置名称,不应该用于自己的变量)。将iniBalance保留为浮点数,只有在使用.format()方法将其打印出来时才转换为字符串。

Pythonic版本

要利用Python功能,您的功能应该更像这样:

 from decimal import Decimal

def bank_interest(balance, rate, years=10):
    """Calulate the new balance with given rate for number of years.

    Parameters
    ----------
    balance : initial balance
    rate : interest rate in percent, e.g. 7.8  for 7.8%
    years : years for which compound interest is to be calculated (default is 10)

    `balance` and `rate` need to of type `int` or `decimal.Decimal`

    Returns
    -------
    balance : new balance including compound interest
    """

    rate = rate * Decimal('0.01')
    for x in range(1, 1 + years):
        balance += balance * rate
    return balance

print('{:.2f}'.format(bank_interest(100, 10)))
print('{:.2f}'.format(bank_interest(100, Decimal('7.8'))))

输出:

259.37
211.93

按照惯例,变量名称应使用下划线。因此,iniBalance应该成为ini_balance。你硬连线years。它使您的函数更易于使用,years作为默认参数,值为10。 为您的函数提供描述文档字符串。输入以下命令可以使用此文档字符串:

>>> help(bank_interest)

在Python提示符下。

此外,将balance作为函数结果返回允许您再次使用此函数,例如在循环中。在调用函数后,将打印作为最后一件事。只允许使用整数或小数。见下面的警告。

警告

在进行数学计算时不要使用浮点数因为舍入误差而不安全。在Python中,您应该使用Decimal,如下所示:

from decimal import Decimal

balance = Decimal('100.00')
rate = Decimal('0.02')

new_rate = rate * Decimal('0.01')

答案 1 :(得分:0)

您希望使用round()代替int()进行中间计算:

def bank_interest(ini_balance, rate, periods):
    rate = int(rate)  / 100.0
    for x in range(periods):
        ini_balance = round(ini_balance * (1 + rate), 2)
    return ini_balance

print bank_interest(100, 10, 10)