【发布时间】:2019-12-19 12:46:42
【问题描述】:
我正在尝试创建一个函数,该函数将根据指定的百分比(好的,预算)将数字分成类别。
我采用了分开的浮点数,从网上抓取了一个测试截断函数,并截断了百位之后的所有内容。这是为了防止所有类别的总和大于初始数量。然后我从初始金额中减去类别的总和,得到“余数”,在我的示例中应该是 0.03 或 3 美分。
def budget_calc(amount):
budget = {"t":0.10,
"c":0.50,
"s":0.20,
"e":0.05,
"c/m":0.05,
"tr":0.05,
"o":0.03,
"g/d":0.02}
def truncate(x, d):
return int(x*(10.0**d))/(10.0**d)
def multp(key):
cate = truncate(amount * budget.get(key), 2)
return cate
new_amounts = {'t': multp('t'),
'c': multp('c'),
's': multp('s'),
'e': multp('e'),
'c/m': multp('c/m'),
'tr': multp('tr'),
'o': multp('o'),
'g/d': multp('g/d')}
remainder = amount - sum(new_amounts.values())
new_amounts.update(remainder = remainder)
return new_amounts
这就是我得到的:
budget_calc(148.72)
{'t': 14.87,
'c': 74.36,
's': 29.74,
'e': 7.43,
'c/m': 7.43,
'tr': 7.43,
'o': 4.46,
'g/d': 2.97,
'remainder': 0.029999999999972715} #<-- this number should only contain two decimal points
所以“截断”函数只是显示截断的数字,实际上并没有去除多余的数字?那里的数学也是错误的,148.72 - 所有截断数字的总和 (148.69) 应该是 0.03。看起来就是这样,额外的诊断会很棒。
【问题讨论】:
-
您可能想阅读此stackoverflow.com/questions/588004/… 以基本了解(二进制)浮点运算。你可以使用
decimal包来实现你想要的。