Java 试图了解我的循环哪里出错

Java 试图了解我的循环哪里出错,java,decimalformat,system.in,Java,Decimalformat,System.in,因此,我的任务是: 一家邮政公司的包裹第一次收费15美元 一磅或其一小部分,超过一磅的每磅10美元 英镑编写一个程序来打印一个包的费用 变量: 重量 第一次执行: 体重-12重量必须是正数 第二次执行: 体重?0权重必须为正数 第三次执行: 体重?2薪酬:25.00美元 第四次执行: 体重?2.8薪酬:33.00美元 第五次执行: 体重?2.07薪酬:25.70美元 以下是我迄今为止开发的代码: import java.text.DecimalFormat; import java.util.

因此,我的任务是:

一家邮政公司的包裹第一次收费15美元 一磅或其一小部分,超过一磅的每磅10美元 英镑编写一个程序来打印一个包的费用

变量:

重量

第一次执行:

体重-12重量必须是正数

第二次执行:

体重?0权重必须为正数

第三次执行:

体重?2薪酬:25.00美元

第四次执行:

体重?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));

        }
    }
}
导入java.text.DecimalFormat;
导入java.util.Scanner;
公共班机{
公共静态void main(字符串[]args){
扫描仪键盘=新扫描仪(System.in);
双倍重量;
双倍成本=15.00;//将第一磅设置为15美元
双输出=0;
系统输出打印(“重量:”;
权重=键盘.nextDouble();
如果(重量1){
输出=输出+(1/10.00);
}
}
//打印包裹的费用
产出=产出+成本;
十进制货币=新的十进制货币($0.00);
System.out.println(“Pay:+money.format(输出));
}
}
}

一切正常,但我不明白的是为什么(特别是在第四次和第五次执行中)最终输出总是0.10美分。有人能帮我达到我需要的准确度吗?

这个:
double I=1;i<体重;i=i+.01
可能是您的问题

对于十进制数学来说,双精度是不精确的。您期望i==weight,此时循环应该停止,但这可能不是因为i+.01(无论多少次)比weight小一小部分

我的建议是放弃这个循环。如果包裹重量超过1磅,只需从重量中减去1磅,乘以每磅10美元,然后四舍五入到所需的小数点后两位(注意:根据规格的四舍五入方式对其进行四舍五入,不要让从双精度到十进制的转换自行完成。有多种方法可以对某事物进行四舍五入,而十进制无法神奇地知道哪种方法适合您的问题。)


编辑:看看你的解决方案,它是否只适用于1/10 lb的分辨率?如果是这样,从四舍五入重量开始。再次,根据需要四舍五入的方式对其进行四舍五入(向下、向上或最近).

如果我理解正确,你永远不应该有任何零碎的美元金额,因为任何超过一磅的东西都会自动四舍五入到下一磅。即:2.01磅将变成3磅。如果这是正确的,那么你可以使用数学的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));

    }
}
公共类主{
公共静态void main(字符串[]args){
扫描仪键盘=新扫描仪(System.in);
双倍重量;
双倍成本=15.00;//将第一磅设置为15美元
双输出=0;
系统输出打印(“重量:”;
权重=键盘.nextDouble();
if(权重0;i--){
输出+=10;
}
产量+=成本;
十进制货币=新的十进制货币($0.00);
System.out.println(“Pay:+money.format(输出));
}
}
}


这样,您就不必为10美分的增量而烦恼了。我希望这会有所帮助。如果您有任何问题,请告诉我。

以下是我的想法:

    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));
    }
扫描仪键盘=新扫描仪(System.in);
双倍重量;
双倍成本=15.00;//将第一磅设置为15美元
双输出=0;
系统输出打印(“重量:”;
权重=键盘.nextDouble();
如果(重量1){
产量=成本+((重量-1)*10);
}否则{
产出=成本;
}
十进制货币=新的十进制货币($0.00);
System.out.println(“Pay:+money.format(输出));
}

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

输出=输出+(1/10.00);
准确地添加
.10
?检查循环中是否不需要权重>1;否则,您的if-else确保了这一点,即
系统.out.println(--weight*10+15);
解决您的问题problem@LuigiCortese先告诉我吧,我正要建议不要使用循环,而是使用公式。看我的答案-使用双精度进行比较是个坏消息。不管怎样,你要舍入它,使用一个好的和可预测的int。太好了,谢谢你,我看到了你是多么简单,非常有洞察力,没有问题很高兴能帮上忙。这对理解这个概念非常有帮助,非常感谢