0

这不是格式的问题。

我正在做一些学习/练习,并决定在 Python 中创建一个“小费计算器”。我很清楚某些数字、使用浮点数等可能存在舍入误差。而且我知道我应该尽可能只处理便士/整数。

在根据百分比计算总计(以美元为单位)时,如何正确避免四舍五入?

理想情况下,我有一个函数,它接受一个percentagesubtotal返回“小费”总数(基于百分比)和新票总数——在不四舍五入的情况下进行金钱数学,就像我在纸上做一样/在我的计算器上。

目前,我有这样的事情:

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)中提出的问题,如果有帮助,我将尝试解决这些问题:

  1. 百分比的类型是什么?
  2. pennies_sub_total 的类型是什么?(编辑 - 你确实提到这是 int)
  3. 赋值后的百分比是否与传入时的类型相同。
  4. 您是否打算将它们以 Decimal、int、float、str 的形式处理?
  5. 然后你有问题要回答,小费的类型和总数。“公式”中的 100 将是一个整数。小费的类型是什么?
  6. 正如所指出的,您还必须确定 1.8855 是否是您想要的 12.57 的 15% 的结果。
  1. intdecimal.Decimal。我不确定这两者之间是否重要......?
  2. int,但这个问题已经解决了。
  3. 也许?它没有被退回。如果我搞砸了一些范围的东西,请告诉我。这并不是要修改此函数“范围”之外的任何变量。
  4. 见 1 和 2。
  5. tip应该可能以decimal.Decimal或整数“便士”的形式返回。在现有的代码示例中,我相信我模棱两可地将其保留为浮点数。这个特定的行/作业是提供答案的特定位置,因为它是完成“真正”工作的地方。
  6. 认为我的问题很清楚地表明,任何小于一分钱的东西都应该被忽略。“1.8855”是一个很好的结果,只要任何数学处理“小计+小费”部分不会向上/向下舍入,而是简单地将便士加起来——再次,另一个提供建议的好地方,因为这就是我想要的以确保我做得正确。
4

3 回答 3

3
>>> import decimal

>>> decimal.Decimal('1.99')
Decimal('1.99')

该模块的目的是使用熟悉的“校舍”规则支持算术,并避免与二进制浮点相关的一些棘手的表示问题。该软件包对于金融应用程序或用户期望与二进制浮点不一致的上下文特别有用(例如,在二进制浮点中,1.00 % 0.1 给出 0.09999999999999995 而不是十进制返回的预期 Decimal('0.00')浮点)。

于 2013-09-11T20:30:54.463 回答
1

算术的精度不是问题:如果结果相差 10 -14美分,那就足够接近了。真正的问题是对结果进行四舍五入,这样您就不会显示比有效数字更多的数字。这是一个很容易解决的问题:

>>> print "tip: %.2f total: %.2f" % (0.15*12.57, 1.15*12.57)
tip: 1.89 total: 14.46
于 2013-09-11T21:52:12.050 回答
1

您有许多问题,并留下了一些问题供我们猜测。

  1. 百分比的类型是什么?
  2. pennies_sub_total 的类型是什么(编辑 - 你确实提到这是 int)
  3. 赋值后的百分比是否与传入时的类型相同。
  4. 您是否打算将它们以 Decimal、int、float、str 的形式处理?
  5. 然后你有问题要回答,小费的类型和总数。“公式”中的 100 将是一个整数。小费的类型是什么?
  6. 正如所指出的,您还必须确定 1.8855 是否是您想要的 12.57 的 15% 的结果。

要回答这些问题,我建议您只需了解一下在 python 解释器中运行的函数和显示结果是什么。例如,

>>> tip = (pennies_sub_total * percentage) / 100
>>> tip
于 2013-09-11T21:14:29.407 回答