试图了解我的循环错误的地方

时间:2015-09-15 20:00:03

标签: java decimalformat system.in

所以这是我的任务:

  

一家邮政公司的第一个包收费15美元   一磅或一小部分,每磅10美元以上的任何东西   磅。编写打印包装费用的程序。

     

变量:

     

重量

     

首次执行:

     

重量? -12重量必须是正数。

     

第二次执行:

     

重量? 0重量必须是正数。

     

第三次执行:

     

重量? 2付:25.00美元

     

Forth Execution:

     

重量? 2.8报酬:33.00美元

     

第五次执行:

     

重量? 2.07支付:25.70美元

以下是我到目前为止开发的代码:

 import java.text.DecimalFormat;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        double weight;
        double cost = 15.00; // set first pound to $15
        double output = 0;
        System.out.print("Weight?: ");
        weight = keyboard.nextDouble();
        if (weight <= 0) {
            System.out.println("Weight must be a positive number.");
        } else if (weight == 1) {
            // Print the charge of the package
            output = output + cost;
            DecimalFormat money = new DecimalFormat("$0.00");
            System.out.println("Pay: " + money.format(output));
        } else {
            for (double i = 1; i < weight; i = i + .01) {
                if (weight > 1) {
                    output = output + (1 / 10.00);
                }
            }
            // Print the charge of the package
            output = output + cost;
            DecimalFormat money = new DecimalFormat("$0.00");
            System.out.println("Pay: " + money.format(output));

        }
    }
}

一切正常,但我无法弄清楚为什么(特别是在第四和第五次执行中)最终输出总是.10美分。任何人都可以帮助我达到我需要的准确度吗?

3 个答案:

答案 0 :(得分:0)

这:double i = 1; i < weight; i = i + .01可能是你的问题。

双精度对于十进制数学并不精确。你期望i ==权重,此时循环应该停止,但它可能不会,因为i + .01(无论多少次)是一个小于权重的小部分。

我的建议是放弃循环。如果包装超过1磅,只需从重量中减去一磅,再乘以每磅10美元,然后四舍五入到你需要的两位小数(注意:根据它的规格来计算它的规格&#39; d要四舍五入,不要让它自己从双精度转换成十进制。有多种方法可以对某些东西进行舍入,而十进制并不能神奇地知道哪一种方法适合你的问题。)

编辑:看看你的解决方案,它应该只能达到1/10磅的分辨率吗?如果是这样,首先将重量四舍五入。再次,根据它需要舍入(向下,向上或最近)来围绕它。

答案 1 :(得分:0)

如果我正确理解了这个问题,你就不应该有任何小数元金额,因为任何超过一磅的东西都会被自动四舍五入到下一磅。即:2.01磅将变成3磅。如果这是正确的,那么您可以使用Math的ceil函数将权重四舍五入到最接近的整磅,然后执行以下操作:

public class Main {
public static void main(String[] args) {
    Scanner keyboard = new Scanner(System.in);
    double weight;
    double cost = 15.00; // set first pound to $15
    double output = 0;
    System.out.print("Weight?: ");
    weight = keyboard.nextDouble();
    if (weight <= 0) {
        System.out.println("Weight must be a positive number.");
    } else if (weight == 1) {
        // Print the charge of the package
        output = output + cost;
        DecimalFormat money = new DecimalFormat("$0.00");
        System.out.println("Pay: " + money.format(output));
    } else {
        double temp = (Math.ceil(weight)) - 1;
        for(double i = temp; i > 0; i-- ) {
            output += 10;
        }
        output += cost;
        DecimalFormat money = new DecimalFormat("$0.00");
        System.out.println("Pay: " + money.format(output));

    }
}

}

这样,你不需要费心增加10美分。我希望这有帮助。如果您有任何问题,请告诉我。

答案 2 :(得分:0)

以下是我提出的建议:

    Scanner keyboard = new Scanner(System.in);
    double weight;
    double cost = 15.00; // set first pound to $15
    double output = 0;
    System.out.print("Weight?: ");
    weight = keyboard.nextDouble();
    if (weight <= 0) {
        System.out.println("Weight must be a positive number.");
    } else {
        // Print the charge of the package
        if (weight > 1) {
            output = cost + ((weight-1) * 10);
        } else {
            output = cost;
        }
        DecimalFormat money = new DecimalFormat("$0.00");
        System.out.println("Pay: " + money.format(output));
    }

这应该处理你的所有情况,以及0到1之间的数字,假设它每0.1磅1美元。您可以使用cost + ((weight-1) * 10)公式代替for-loop。我删除了检查以查看权重是否等于1,因为它在else子句中处理。