计算大数的加权平均值

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)

问题是我很快就将"滚动"变量最大化了.

我怎样才能真正得到加权平均值?

Oak*_*Oak 3

一种解决方案是java.math.BigInteger同时使用rollingtotalQuantity,并且仅在最后将它们相除。这具有更好的数字稳定性,因为最后只有一个浮点除法,其他一切都是整数运算。

BigInteger基本上是无界的,所以你不应该遇到任何溢出。

编辑:抱歉,只有在重新阅读后我才注意到您的价格无论如何都是double。也许值得通过将其乘以 100 然后转换为来规避这个问题BigInteger- 因为我在你的示例中看到它正好有小数点右边的 2 位 - 然后在最后除以 100,尽管这有点像黑客。