Python 中的 '//' 运算符未返回正确的解决方案
'//' operator in Python not returning correct solution
我正在为我的 CS 课程编写更改计算器脚本。代码如下:
# Set up our money variables
centValueOfTenDollarBill = 1000
centValueOfFiveDollarBill = 500
centValueOfToonie = 200
centValueOfLoonie = 100
centValueOfQuarter = 25
centValueOfDime = 10
centValueOfNickel = 5
# Set up our variables
purchaseTotal = input("Enter purchase total: ") # Purchase costs .50
moneyPaid = input("Enter money paid: ") # Customer gives cashier .00
# Figure out the change
change = moneyPaid - purchaseTotal
# Echo input data to user
print("""The total of the purchase is $%0.2f.
The customer paid $%0.2f.
The cashier gives $%0.2f back to the customer in the following fashion: """ %(purchaseTotal, moneyPaid, change))
#Convert dollars into cents to facilitate the computation
purchaseTotalInCents = purchaseTotal * 100
moneyPaidInCents = moneyPaid * 100
changeInCents = change * 100
# Determine # of to be given back as part of the change
numberOfTenDollarBills = changeInCents // centValueOfTenDollarBill
changeInCents = changeInCents - (centValueOfTenDollarBill * numberOfTenDollarBills)
# Determine # of to be given back as part of the change
numberOfFiveDollarBills = changeInCents // centValueOfFiveDollarBill
changeInCents -= (centValueOfFiveDollarBill * numberOfFiveDollarBills)
# Determine # of (toonies) to be given back as part of the change
numberOfToonieCoins = changeInCents // centValueOfToonie
changeInCents -= (centValueOfToonie * numberOfToonieCoins)
# Determine # of (loonies) to be given back as part of the change
numberOfLoonieCoins = changeInCents // centValueOfLoonie
changeInCents -= (centValueOfLoonie * numberOfLoonieCoins)
# Determine # of [=11=].25 (quarters) to be given back as part of the change
numberOfQuarterCoins = changeInCents // centValueOfQuarter
changeInCents -= (centValueOfQuarter * numberOfQuarterCoins)
# Determine # of [=11=].10 (dimes) to be given back as part of the change
numberOfDimeCoins = changeInCents // centValueOfDime #<--- PROBLEM HERE IF DIMES ARE TWO
print (numberOfDimeCoins)
changeInCents -= (centValueOfDime * numberOfDimeCoins)
# At this point, changeInCents can either be
# 5 -> 1 x [=11=].05 (nickels) or
# 0 -> 0 x [=11=].05 (nickels)
numberOfNickelCoins = changeInCents // centValueOfNickel
# Output the result: change cashier needs to give back to customer
print("\t%i x .00" %numberOfTenDollarBills)
print("\t%i x $ 5.00" %numberOfFiveDollarBills)
print("\t%i x $ 2.00" %numberOfToonieCoins)
print("\t%i x $ 1.00" %numberOfLoonieCoins)
print("\t%i x $ 0.25" %numberOfQuarterCoins)
print("\t%i x $ 0.10" %numberOfDimeCoins)
print("\t%i x $ 0.05" %numberOfNickelCoins)
# Indicates the end of execution
print("----\n")
所有的错误(至少从我看来是这样)是,如果该程序应该返还两毛钱,它会返还一毛钱和一枚镍币,这让客户找了五美分。如果它应该回馈一毛钱,那就没问题了。
示例:假设客户为一件价值 13.30 美元的商品支付了 20 美元。零钱是 6.70 美元。
numberOfDimeCoins = changeInCents // centValueOfDime
上面这一行应该与 2.0 = 20.0//10.0
相同,但它返回 1.0
.
如果您支付了 20 美元购买任何需要回馈一毛钱的东西,那么一切都是正确的,例如 13.20 美元、13.90 美元或 13.75 美元的物品。
下面是一些示例输出:
Erics-MacBook-Pro:Desktop eric$ python change.py
Enter purchase total: 13.75
Enter money paid: 20
The total of the purchase is .75.
The customer paid .00.
The cashier gives .25 back to the customer in the following fashion:
0 x .00
1 x $ 5.00
0 x $ 2.00
1 x $ 1.00
1 x $ 0.25
0 x $ 0.10
0 x $ 0.05
----
Erics-MacBook-Pro:Desktop eric$ python change.py
Enter purchase total: 12.8
Enter money paid: 20
The total of the purchase is .80.
The customer paid .00.
The cashier gives .20 back to the customer in the following fashion:
0 x .00
1 x $ 5.00
1 x $ 2.00
0 x $ 1.00
0 x $ 0.25
1 x $ 0.10
1 x $ 0.05
----
我是否遗漏或做错了什么?
使用 Python 2.7.
如果检查变量,就会发现问题
>>> changeInCents
19.999999999999886
>>> centValueOfDime
10
这是由于浮点数的精度有限。
您应该将初始值转换为美分。例如
numberspurchaseTotalInCents = int(purchaseTotal * 100)
moneyPaidInCents = int(moneyPaid * 100)
changeInCents = moneyPaidInCents - numberspurchaseTotalInCents
另请查看内置 divmod()
函数
这是因为浮点精度问题。试试这个:
purchaseTotal = 13.3
moneyPaid = 20
change = moneyPaid - purchaseTotal
print(repr(change)) # 6.699999999999999
您可能期望 change
是 0.7
,但实际上它是一个非常接近 0.7
的数字,但并不精确。最后,changeInCents
得到一个你期望的数字 20.0
,但实际上有点小。
我正在尝试调试您的代码,但其他伙伴已经解决了。您对按照 IEEE 754 标准存储数字的方式有疑问(您可以进一步了解 here)。
我建议您使用小数(阅读 here)
非常简单,
#import and set precision
from decimal import *
getcontext().prec = **x** #you decide it
a = Decimal(10)
b = Decimal(0.9)
print a-b
阅读文档,它可以让你设置很多关于如何舍入数字的相关问题。
我正在为我的 CS 课程编写更改计算器脚本。代码如下:
# Set up our money variables
centValueOfTenDollarBill = 1000
centValueOfFiveDollarBill = 500
centValueOfToonie = 200
centValueOfLoonie = 100
centValueOfQuarter = 25
centValueOfDime = 10
centValueOfNickel = 5
# Set up our variables
purchaseTotal = input("Enter purchase total: ") # Purchase costs .50
moneyPaid = input("Enter money paid: ") # Customer gives cashier .00
# Figure out the change
change = moneyPaid - purchaseTotal
# Echo input data to user
print("""The total of the purchase is $%0.2f.
The customer paid $%0.2f.
The cashier gives $%0.2f back to the customer in the following fashion: """ %(purchaseTotal, moneyPaid, change))
#Convert dollars into cents to facilitate the computation
purchaseTotalInCents = purchaseTotal * 100
moneyPaidInCents = moneyPaid * 100
changeInCents = change * 100
# Determine # of to be given back as part of the change
numberOfTenDollarBills = changeInCents // centValueOfTenDollarBill
changeInCents = changeInCents - (centValueOfTenDollarBill * numberOfTenDollarBills)
# Determine # of to be given back as part of the change
numberOfFiveDollarBills = changeInCents // centValueOfFiveDollarBill
changeInCents -= (centValueOfFiveDollarBill * numberOfFiveDollarBills)
# Determine # of (toonies) to be given back as part of the change
numberOfToonieCoins = changeInCents // centValueOfToonie
changeInCents -= (centValueOfToonie * numberOfToonieCoins)
# Determine # of (loonies) to be given back as part of the change
numberOfLoonieCoins = changeInCents // centValueOfLoonie
changeInCents -= (centValueOfLoonie * numberOfLoonieCoins)
# Determine # of [=11=].25 (quarters) to be given back as part of the change
numberOfQuarterCoins = changeInCents // centValueOfQuarter
changeInCents -= (centValueOfQuarter * numberOfQuarterCoins)
# Determine # of [=11=].10 (dimes) to be given back as part of the change
numberOfDimeCoins = changeInCents // centValueOfDime #<--- PROBLEM HERE IF DIMES ARE TWO
print (numberOfDimeCoins)
changeInCents -= (centValueOfDime * numberOfDimeCoins)
# At this point, changeInCents can either be
# 5 -> 1 x [=11=].05 (nickels) or
# 0 -> 0 x [=11=].05 (nickels)
numberOfNickelCoins = changeInCents // centValueOfNickel
# Output the result: change cashier needs to give back to customer
print("\t%i x .00" %numberOfTenDollarBills)
print("\t%i x $ 5.00" %numberOfFiveDollarBills)
print("\t%i x $ 2.00" %numberOfToonieCoins)
print("\t%i x $ 1.00" %numberOfLoonieCoins)
print("\t%i x $ 0.25" %numberOfQuarterCoins)
print("\t%i x $ 0.10" %numberOfDimeCoins)
print("\t%i x $ 0.05" %numberOfNickelCoins)
# Indicates the end of execution
print("----\n")
所有的错误(至少从我看来是这样)是,如果该程序应该返还两毛钱,它会返还一毛钱和一枚镍币,这让客户找了五美分。如果它应该回馈一毛钱,那就没问题了。
示例:假设客户为一件价值 13.30 美元的商品支付了 20 美元。零钱是 6.70 美元。
numberOfDimeCoins = changeInCents // centValueOfDime
上面这一行应该与 2.0 = 20.0//10.0
相同,但它返回 1.0
.
如果您支付了 20 美元购买任何需要回馈一毛钱的东西,那么一切都是正确的,例如 13.20 美元、13.90 美元或 13.75 美元的物品。
下面是一些示例输出:
Erics-MacBook-Pro:Desktop eric$ python change.py
Enter purchase total: 13.75
Enter money paid: 20
The total of the purchase is .75.
The customer paid .00.
The cashier gives .25 back to the customer in the following fashion:
0 x .00
1 x $ 5.00
0 x $ 2.00
1 x $ 1.00
1 x $ 0.25
0 x $ 0.10
0 x $ 0.05
----
Erics-MacBook-Pro:Desktop eric$ python change.py
Enter purchase total: 12.8
Enter money paid: 20
The total of the purchase is .80.
The customer paid .00.
The cashier gives .20 back to the customer in the following fashion:
0 x .00
1 x $ 5.00
1 x $ 2.00
0 x $ 1.00
0 x $ 0.25
1 x $ 0.10
1 x $ 0.05
----
我是否遗漏或做错了什么?
使用 Python 2.7.
如果检查变量,就会发现问题
>>> changeInCents
19.999999999999886
>>> centValueOfDime
10
这是由于浮点数的精度有限。
您应该将初始值转换为美分。例如
numberspurchaseTotalInCents = int(purchaseTotal * 100)
moneyPaidInCents = int(moneyPaid * 100)
changeInCents = moneyPaidInCents - numberspurchaseTotalInCents
另请查看内置 divmod()
函数
这是因为浮点精度问题。试试这个:
purchaseTotal = 13.3
moneyPaid = 20
change = moneyPaid - purchaseTotal
print(repr(change)) # 6.699999999999999
您可能期望 change
是 0.7
,但实际上它是一个非常接近 0.7
的数字,但并不精确。最后,changeInCents
得到一个你期望的数字 20.0
,但实际上有点小。
我正在尝试调试您的代码,但其他伙伴已经解决了。您对按照 IEEE 754 标准存储数字的方式有疑问(您可以进一步了解 here)。
我建议您使用小数(阅读 here)
非常简单,
#import and set precision
from decimal import *
getcontext().prec = **x** #you decide it
a = Decimal(10)
b = Decimal(0.9)
print a-b
阅读文档,它可以让你设置很多关于如何舍入数字的相关问题。