我知道如何在Python中对数字进行舍入,这不是一个简单的技术问题。
我的问题是,从技术上讲,舍入将使一组百分比不增加到100%。
例如:
a = 1
b = 14
我想计算a(a + b)和b(a + b)中的百分比。
答案应该是
a/(a + b) = 1/15
b/(a + b) = 14/15
当我试图绕过这些数字时,我得到了
1/15 = 6.66
14/15 = 93.33
(我正在做地板),这使得这两个数字不能达到100%。
在这种情况下,我们应该做1/15的天花板,即6.67,14/15的地板,即93.33。现在他们加起来达到了100%。在这种情况下,规则应该是"四舍五入到最接近的数字"
但是,如果我们有一个更复杂的案例,比如3个数字:
a = 1
b = 7
c = 7
地板:
1/15 = 6.66
7/15 = 46.66
7/15 = 46.66
不加100%。
天花板:
1/15 = 6.67
7/15 = 46.67
7/15 = 46.67
不能达到100%。
舍入(到最接近的数字)与天花板相同。仍然没有达到100%。
所以我的问题是我应该怎么做以确保在任何情况下它们都加起来为100%。
提前致谢。
更新: 感谢评论提示。我已经拿走了#34;最大的余数"来自重复的帖子答案的解决方案。
代码是:
def round_to_100_percent(number_set, digit_after_decimal=2):
"""
This function take a list of number and return a list of percentage, which represents the portion of each number in sum of all numbers
Moreover, those percentages are adding up to 100%!!!
Notice: the algorithm we are using here is 'Largest Remainder'
The down-side is that the results won't be accurate, but they are never accurate anyway:)
"""
unround_numbers = [x / float(sum(number_set)) * 100 * 10 ** digit_after_decimal for x in number_set]
decimal_part_with_index = sorted([(index, unround_numbers[index] % 1) for index in range(len(unround_numbers))], key=lambda y: y[1], reverse=True)
remainder = 100 * 10 ** digit_after_decimal - sum([int(x) for x in unround_numbers])
index = 0
while remainder > 0:
unround_numbers[decimal_part_with_index[index][0]] += 1
remainder -= 1
index = (index + 1) % len(number_set)
return [int(x) / float(10 ** digit_after_decimal) for x in unround_numbers]
经测试,似乎工作正常。
答案 0 :(得分:0)
正如其他人所评论的那样,如果你的数字在你的例子中是好的和圆的,你可以使用fractions模块来保持有理数的准确性:
In [2]: from fractions import Fraction
In [5]: a = Fraction(1)
In [6]: b = Fraction(14)
In [7]: a/(a+b)
Out[7]: Fraction(1, 15)
In [8]: a/(a+b) + (b/(a+b))
Out[8]: Fraction(1, 1)
如果你真的有奇怪的分数,这显然不会很好。
答案 1 :(得分:-3)
欢迎使用IEEE Floats。
从python中的数学运算返回的浮点数是近似值。在某些值上,百分比之和将大于100。
您有两种解决方案:使用fraction
或decimal
模块或者,根本不希望它们加起来达到100%。