Tra*_*vis 6 java average weighted-average
我想要得到几个数字的加权平均值.基本上我有:
Price - 134.42
Quantity - 15236545
Run Code Online (Sandbox Code Playgroud)
可以有少至一个或两个或多达五十或六十对价格和数量.我需要弄清楚价格的加权平均值.基本上,加权平均值应该给对象提供非常小的权重
Price - 100000000.00
Quantity - 3
Run Code Online (Sandbox Code Playgroud)
以及更多对上面的那对.
我现在的公式是:
((price)(quantity) + (price)(quantity) + ...)/totalQuantity
Run Code Online (Sandbox Code Playgroud)
到目前为止,我做到了这一点:
double optimalPrice = 0;
int totalQuantity = 0;
double rolling = 0;
System.out.println(rolling);
Iterator it = orders.entrySet().iterator();
while(it.hasNext()) {
System.out.println("inside");
Map.Entry order = (Map.Entry)it.next();
double price = (Double)order.getKey();
int quantity = (Integer)order.getValue();
System.out.println(price + " " + quantity);
rolling += price * quantity;
totalQuantity += quantity;
System.out.println(rolling);
}
System.out.println(rolling);
return rolling/totalQuantity;
Run Code Online (Sandbox Code Playgroud)
问题是我很快就将"滚动"变量最大化了.
我怎样才能真正得到加权平均值?
一种解决方案是java.math.BigInteger同时使用rolling和totalQuantity,并且仅在最后将它们相除。这具有更好的数字稳定性,因为最后只有一个浮点除法,其他一切都是整数运算。
BigInteger基本上是无界的,所以你不应该遇到任何溢出。
编辑:抱歉,只有在重新阅读后我才注意到您的价格无论如何都是double。也许值得通过将其乘以 100 然后转换为来规避这个问题BigInteger- 因为我在你的示例中看到它正好有小数点右边的 2 位 - 然后在最后除以 100,尽管这有点像黑客。
| 归档时间: |
|
| 查看次数: |
5430 次 |
| 最近记录: |