这不是格式的问题。
我正在做一些学习/练习,并决定在 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”是一个很好的结果,只要任何数学处理“小计+小费”部分不会向上/向下舍入,而是简单地将便士加起来——再次,另一个提供建议的好地方,因为这就是我想要的以确保我做得正确。