在Python中指定小数位数

时间:2010-07-11 02:42:48

标签: python

在Python中接受带小数的用户输入时我正在使用:

#will input meal subtotal  
def input_meal():  
    mealPrice = input('Enter the meal subtotal: $')  
    mealPrice = float (mealPrice)  
    return mealPrice  

返回确切输入的内容 - 比如$ 43.45
但是当使用该值来计算和显示我正在使用的税时:

#will calculate 6% tax  
def calc_tax(mealPrice):  
    tax = mealPrice*.06  
    return tax

使用

返回$ 2.607的显示
mealPrice = input_meal()
tax = calc_tax(mealPrice)
display_data(mealPrice, tax)  

如何将其设为2.61美元呢? 原谅我,我意识到这是基本的东西,但他们并没有把它简称为Intro ......

谢谢!

6 个答案:

答案 0 :(得分:24)

有几种方法可以执行此操作,具体取决于您希望如何保留值。

您可以使用基本的字符串格式,例如

'Your Meal Price is %.2f' %  mealPrice

您可以将2修改为您需要的精度。

但是,由于您正在处理资金,因此您应该查看decimal模块,该模块有一个名为quantize的酷方法,它正好适用于货币应用程序。您可以像这样使用它:

from decimal import Decimal, ROUND_DOWN
mealPrice = Decimal(str(mealPrice)).quantize(Decimal('.01'), rounding=ROUND_DOWN)

请注意,rounding属性也是纯粹可选的。

答案 1 :(得分:7)

我对你提到的第二个数字感到惊讶(并通过你要求的舍入确认) - 起初我以为我的心算的本能开始让我失望(我变老了,毕竟,这可能和我曾经记忆犹新的内存一样! - )...然后我确认它还没有,正如我想象的那样,使用Python 3.1,以及复制和粘贴..:

>>> def input_meal():  
...     mealPrice = input('Enter the meal subtotal: $')  
...     mealPrice = float (mealPrice)  
...     return mealPrice  
... 
>>> def calc_tax(mealPrice):  
...     tax = mealPrice*.06  
...     return tax
... 
>>> m = input_meal()
Enter the meal subtotal: $34.45
>>> print(calc_tax(m))
2.067
>>> 

......正如预期的那样 - 然而,你说它“返回显示$ 2.607”......这可能是一个错字,只是交换两位数,除了你然后问“我怎么能设置为2.61美元?“所以看起来你真的意味着2.607(可能以各种方式舍入到2.61)并且绝对不是算术上正确的结果2.067(最多可能会舍入到2.07 ......绝对< em> not to 2.61(如您所要求))。

我想你首先在转录中出现了拼写错误,然后通过错误的伪造2.607而不是实际的原始结果进行心理计算所需的舍入 - 这是发生了什么?它确实让我困惑了一段时间! - )

无论如何,要将浮点数舍入为两位小数,最简单的方法是内置函数round,第二个参数为2

>>> round(2.067, 2)
2.07
>>> round(2.607, 2)
2.61

对于两种可能性之间完全等距的数字,它是舍入到均匀的:

>>> round(2.605, 2)
2.6
>>> round(2.615, 2)
2.62

或者,正如文档所说的那样(用round的单参数形式举例说明,它是最接近的整数):

  

如果两个倍数相等,则向着舍入进行舍入   甚至选择(例如,两者兼而有之   圆(0.5)和圆(-0.5)是0,和   圆(1.5)是2)。

然而,对于金钱的计算,我在其他答案中已经提出的建议,坚持decimal模块提供的内容,而不是float数字。

答案 2 :(得分:2)

您没有显示display_data的代码,但这是您需要做的事情:

print "$%0.02f" %amount

这是变量amount的{​​{3}}。

由于这是初学者话题,我不会进入format specifier,但要注意它存在是件好事。

答案 3 :(得分:2)

要计算税金,您可以使用round(毕竟,这就是餐厅所做的):

def calc_tax(mealPrice):  
    tax = round(mealPrice*.06,2)
    return tax

要显示数据,您可以使用多行字符串和string format method

def display_data(mealPrice, tax):
    total=round(mealPrice+tax,2)
    print('''\
Your Meal Price is {m:=5.2f}
Tax                {x:=5.2f}
Total              {t:=5.2f}
'''.format(m=mealPrice,x=tax,t=total))

请注意,格式方法是在Python 2.6中引入的,对于早期版本,您需要使用旧式字符串插值%

    print('''\
Your Meal Price is %5.2f
Tax                %5.2f
Total              %5.2f
'''%(mealPrice,tax,total))

然后

mealPrice=input_meal()
tax=calc_tax(mealPrice)
display_data(mealPrice,tax)

的产率:

# Enter the meal subtotal: $43.45
# Your Meal Price is 43.45
# Tax                 2.61
# Total              46.06

答案 4 :(得分:1)

这个标准库解决方案可能没有被提及,因为这个问题已经过时了。尽管这些答案可能会扩展到货币之外的其他用例,而货币需要使用不同的小数位,但似乎您需要货币来代替。

我建议您使用标准库locale.currency对象。它似乎是为解决货币代表问题而创建的。

import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

locale.currency(1.23)
>>>'$1.23'
locale.currency(1.53251)
>>>'$1.23'
locale.currency(1)
>>>'$1.00'

locale.currency(mealPrice)

货币也可以推广到其他国家。

答案 5 :(得分:0)

使用round()函数。

round(2.607) = 3
round(2.607,2) = 2.61