【发布时间】:2013-09-11 20:29:46
【问题描述】:
这不是格式问题。
我正在做一些学习/exrcize,并决定在 Python 中创建一个“小费计算器”。我很清楚某些数字、使用浮点数等可能存在舍入错误。而且我知道我应该尽可能只处理便士/整数。
在根据百分比计算总计(以美元为单位)时,如何正确避免四舍五入?
理想情况下,我应该有一个函数,它接受 percentage 和 subtotal 并返回“小费”总数(基于百分比)和新票总数 -- 在不四舍五入的情况下进行货币计算,就像我在纸上做的一样 / 在我的计算器上。
目前,我有这样的事情:
import decimal
def get_tip(percentage, pennies_sub_total):
""""
param percentage: I suspect this should be int() or decimal.Decimal. I'm not aware of a condition that would make it matter either way. You?
param pennies_sub_total = int()
"""
percentage = decimal.Decimal(percentage)
pennies_sub_total = decimal.Decimal(pennies_sub_total) # Unnecessary use of Decimal?
tip = (pennies_sub_total * percentage) / 100
total = (pennies_sub_total + tip)
return {'tip': tip, 'total': total}
...这似乎可行,但我不确定如何严格测试它——所以我来这里进行代码审查。 我是否忽略了任何明显的东西?我是否以我应该有信心的方式做到这一点?
更新
鉴于其中一个答案 (https://stackoverflow.com/a/18751401/26196) 中提出的问题,如果有帮助,我将尝试解决这些问题:
- 百分比的类型是什么?
- pennies_sub_total 的类型是什么? (编辑 - 你确实提到这是 int)
- 分配后的百分比是否与传入时的类型相同。
- 您是否计划将它们作为 Decimal、int、float、str 处理?
- 然后你有问题要回答,小费的类型和总数。 “公式”中的 100 将是一个整数。小费的类型是什么?
- 正如所指出的,您还必须确定 1.8855 是否是您想要的 12.57 的 15% 的结果。
-
int或decimal.Decimal。我不确定这两者之间是否重要......? -
int,但这个问题已经解决了。 - 也许?它没有被退回。如果我搞砸了一些范围的东西,请告诉我。这并不是要修改此函数“范围”之外的任何变量。
- 见 1 和 2。
-
tip应该以decimal.Decimal或整数“便士”的形式返回。在现有的代码示例中,我相信我模棱两可地将其保留为浮点数。这个特定的行/作业是提供答案的特定位置,因为它是完成“真正”工作的地方。 - 我认为我的问题很清楚地表明,任何小于一分钱的东西都应该被忽略。 “1.8855”是一个很好的结果,只要任何数学处理“小计+小费”部分不会向上/向下舍入,而是简单地将便士加起来——再次,另一个提供建议的好地方,因为这就是我想要的以确保我做得正确。
【问题讨论】:
-
“没有四舍五入,就像...在纸上”没有意义。 1 美分餐的 15% 小费是多少?
-
“所以我来这里进行代码审查” --> 试试codereview
-
@Teepeemm 我忘了我在和程序员打交道:“0”是你问题的答案。
-
@askewchan 没有意识到那是一回事。感谢您的提示!
-
@BurhanKhalid 也许我在以前的编辑中更正了我的代码,但我没有看到那行。