在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呢?
请原谅我,我知道这很基础,但这就是入门课程的意义所在...
谢谢!
6 个回答
要计算税费,你可以使用 round
函数(毕竟,这就是餐厅的做法):
def calc_tax(mealPrice):
tax = round(mealPrice*.06,2)
return tax
要展示数据,你可以使用多行字符串,以及 字符串格式化方法:
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
我对你提到的第二个数字感到很惊讶(你要求的四舍五入也证实了这一点)——起初我以为我的心算能力开始退化了(毕竟我在变老,记忆力也可能跟着下降!)……但后来我用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……绝对不是你要求的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
的单参数形式为例,它会四舍五入到最接近的整数):
如果两个倍数同样接近,四舍五入会选择偶数(例如,
round(0.5)
和round(-0.5)
都是0,而round(1.5)
是2)。
不过,对于涉及金钱的计算,我支持之前其他答案中提到的建议,使用 decimal 模块,而不是 float
数字。
根据你想要保存的数值,有几种方法可以做到这一点。
你可以使用基本的字符串格式化,比如:
'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
这个属性是可选的。