繁体   English   中英

初学者Java程序员算术错误

[英]Beginner Java programmer arithmetic error

我最近开始从事Java编程,并认为自己是编程新手。 似乎我的源代码算法有问题。 我已经验证了所有嵌套的if-else语句,它们都可以达到最终else语句的算法。 它计算不正确,就像上面的if-else语句一样,我已经设置了算法。

else语句假定从金额中减去40,然后加上1%的费用。 我已经尝试过else陈述式fee = ((checkAmount - 40) * .01)fee = ((checkAmount * .01) - 40)

这只是本书的练习

  import java.util.Scanner;
public class ServiceCharge {
public static void main(String[] args)
{
    double checkAmount;
    double fee;
    Scanner kb = new Scanner(System.in);
    System.out.println("I will calulate the service charge to cash your check");
    System.out.print("Enter amount of check: $");
    checkAmount = kb.nextDouble();

    if (checkAmount > 0)
    {
        if (checkAmount <= 10)
        {
            fee = -1;
            System.out.println("$1 service charge");
            checkAmount = checkAmount + fee;
            System.err.println("You have " + checkAmount + " left after service charge.");
        }
        else if ((checkAmount > 10) && (checkAmount <= 100))
        {
            System.out.println("There will be a 10 percent charge.");
            fee = (checkAmount * .10);
            checkAmount = checkAmount - fee;
            System.out.printf("Processing fee: $%.2f\n" , fee);
            System.out.printf("Check amount: $%.2f\n" , checkAmount);
        }
        else if ((checkAmount > 100) && (checkAmount <= 1000))
        {
            System.out.println("There will be a $5 charge plus 5 percent");
            fee = ((checkAmount - 5) * .05);
            checkAmount = (checkAmount - fee);
            System.out.printf("Processing fee: $%.2f\n" , fee);
            System.out.printf("Check amount: $%.2f\n", checkAmount);
        }
        else
        {
            System.out.println("$40 processing fee plus 1 percent");
            fee = ((checkAmount - 40) * .01);
            checkAmount = (checkAmount - fee);
            System.out.printf("Processing fee: $%.2f\n" , fee);
            System.out.printf("Check amount: $%.2f\n" , checkAmount);
        }
        System.out.println("Thanks for using Service Charger." + "\nGood bye");
    }
}
}

对于最后的else语句,似乎与其余的语句有点不同。 您使用“保留”存储原始的checkAmount值,然后将checkAmount修改为前三个语句的费用。 您应该像最后一个一样建模最后一个。 checkAmount应该是checkAmount = (checkAmount * .01) + 40 ,然后hold - checkAmount应该返回您要查找的值。 通过使checkAmount = checkAmount - 40 ,最后一行将返回hold (checkAmount) - (checkAmount - 40) ,该值将始终返回40

            System.out.println("$40 processing fee plus 1 percent");
            fee = ((checkAmount - 40) * .01);

那不是40美元的费用+ 1%。 那是略低于1%的费用; 好像您是免费兑现前40美元,然后对其余部分收取1%的费用。

假设对整张支票收取1%的费用,而不是减去40美元后剩下的费用,则费用的正确表达式为

            fee = 40 + 0.01*checkAmount;

实际上,您只想根据原始表达只收取支票金额的1%费用减去40美元的固定费用,因此表达应为:

fee = 40 + (checkAmount - 40) * .01;

您的代码中有很多重复项,这使得查看正在发生的事情变得更加困难,并且如果您决定更改(例如)要显示给用户的消息,则现在需要在4个位置进行更改,发生了很大的变化,您忘记了在某个地方做,或者您打错了字。

良好编程的目标之一是尽可能避免重复。

public class ServiceCharge {
    public static void main(String[] args) {

        Scanner kb = new Scanner(System.in);
        System.out.println("I will calulate the service charge to cash your check");
        System.out.print("Enter amount of check: $");
        double checkAmount = kb.nextDouble();

        if (checkAmount > 0) {
            double fee;
            String feeMessage;
            if (checkAmount <= 10) {
                fee = 1;
                feeMessage = "$1 service charge";
            } else if ((checkAmount > 10) && (checkAmount <= 100)) {
                feeMessage = "10 percent charge.";
                fee = (checkAmount * .10);
            } else if ((checkAmount > 100) && (checkAmount <= 1000)) {
                feeMessage = "$5 charge plus 5 percent";
                fee = 5 + ((checkAmount - 5) * .05);
            } else {
                feeMessage = "$40 processing fee plus 1 percent";
                fee = 40 + ((checkAmount - 40) * .01);
            }
            checkAmount = checkAmount - fee;

            System.out.printf("Fee structure: " + feeMessage);
            System.out.printf("Processing fee: $%.2f\n", fee);
            System.out.printf("Check amount: $%.2f\n", checkAmount);
            System.out.println("Thanks for using Service Charger.\nGood bye");
        }
    }
}

您可能要研究的下一步是将程序从功能上分解为功能。 例如,索要金额的部分,进行计算的部分和显示结果的部分是三个截然不同的部分。 您可能希望分别更改这三个选项中的每一个-您可能希望从文件或Web请求中获取输入,并且可能希望将使用结果存储在另一计算中,而不是向用户显示。

因此,这些可以进入单独的功能。

然后您可以考虑对象分解-也许我们在这里谈论的是CheckCashAction对象,该对象具有checkAmountfeefeeStructurepayoutAmount

等等。

令人高兴的是,您可以分别查看每个步骤并单独进行测试,这使查明错误和维护代码变得更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM