Java Math没有返回正确的答案

时间:2014-05-28 01:36:02

标签: java math division sqrt

我知道这个一般性问题已被问过几次。但是,在审核主题时,很多答案都是针对这个问题的,并且不能回答我的问题。

如果这是一个糟糕或愚蠢的问题,我道歉。我会问我的讲师,但她要到下周才能上班。

我遇到的问题是我在Java程序中有一个不能返回正确值的计算,我不知道为什么。方法是:

public int economicOrderQuantity()
//Calculate the Economic Order Quantity of a product
//Only displays the EOQ for one product for the sake of getting it to work
{
    int economicOrderQuantity=0, demandPerWeek, setupPerOrder, costOfInventoryPerWeek, costOfUnit;
    double orderQuantity, orderQuantity1, inventoryByUnit;        

    demandPerWeek = product1.getDemand();
    setupPerOrder = product1.getSetup();
    costOfInventoryPerWeek = product1.getInventory();
    costOfUnit = product1.getUnit();
    inventoryByUnit = costOfInventoryPerWeek / costOfUnit;

    orderQuantity = (2 * demandPerWeek * setupPerOrder) / inventoryByUnit;  //This is the EOQ algorithm 
    orderQuantity1 = Math.sqrt(orderQuantity);
    economicOrderQuantity = (int) Math.round(orderQuantity);    //Typecasts the value to an integer and rounds it

    return economicOrderQuantity;
}

例如,如果需求率为45,设置成本为132,inventoryByUnit为0.60,那么EOQ将为140.71(四舍五入为141)。但是当我测试代码时,返回的值是109.我调试了代码,它执行计算2 * 45 * 132并返回11880,然后通过inventoryByUnit跳过除法并直接计算平方根并返回108.99 (四舍五入到109)。

对于我做错的任何帮助或建议都会非常感谢欢呼。

2 个答案:

答案 0 :(得分:4)

(除非您使用的是早期的奔腾处理器之一,否则我认为假设Java Math始终返回正确的答案是非常安全的。)

这是因为:

inventoryByUnit = costOfInventoryPerWeek / costOfUnit;

不会返回您的想法。它返回1.两个int之间的除法总是将结果作为int返回。

试试这个:

inventoryByUnit = ((double) costOfInventoryPerWeek) / costOfUnit;

顺便说一句,如果您正在处理的是金钱,那么使用double并不是一种非常推荐的方法。请改用BigDecimal

答案 1 :(得分:2)

inventoryByUnit = costOfInventoryPerWeek / costOfUnit;

这是一个整数除法(即使你赋给它的变量是一个双精度)。你想强迫它加倍

inventoryByUnit = 1.0 * costOfInventoryPerWeek / costOfUnit;