在Python中指定小数位数

21 投票
6 回答
161241 浏览
提问于 2025-04-16 01:06

在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 个回答

3

要计算税费,你可以使用 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
13

我对你提到的第二个数字感到很惊讶(你要求的四舍五入也证实了这一点)——起初我以为我的心算能力开始退化了(毕竟我在变老,记忆力也可能跟着下降!)……但后来我用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 数字。

33

根据你想要保存的数值,有几种方法可以做到这一点。

你可以使用基本的字符串格式化,比如:

'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这个属性是可选的。

撰写回答