首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初学者Java程序员算术错误

初学者Java程序员算术错误
EN

Stack Overflow用户
提问于 2014-02-08 05:48:31
回答 3查看 238关注 0票数 0

最近,我开始了Java编程,并认为自己是编程新手。我的源代码算法似乎有点问题。我已经验证了所有嵌套的if- all语句,它们都达到了最后一个the语句的算术。它没有正确计算,我已经设置了算法,就像上面的if- set语句一样。

then语句应该从金额中减去40,然后应用1%的收费。我尝试过使用fee = ((checkAmount - 40) * .01)fee = ((checkAmount * .01) - 40)语句

这只是一本书上的练习

代码语言:javascript
复制
  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");
    }
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-08 05:56:40

代码语言:javascript
复制
            System.out.println("$40 processing fee plus 1 percent");
            fee = ((checkAmount - 40) * .01);

这可不是40美元加1%的费用。这是一个略低于1%的费用,就好像你免费兑现了前40美元,然后对剩下的部分收取了1%的费用。

假设1%的费用适用于整个支票,而不是减去40美元后剩下的,那么正确的表示是

代码语言:javascript
复制
            fee = 40 + 0.01*checkAmount;
票数 0
EN

Stack Overflow用户

发布于 2014-02-08 04:52:24

对于最后一条of语句,它似乎与您的其余语句有些出入。您使用“持有”来存储原始的checkAmount值,然后修改checkAmount作为前三条语句的费用。你应该把最后一个模仿成它之前的那个。checkAmount应该是checkAmount = (checkAmount * .01) + 40,然后hold - checkAmount应该返回您想要的值。通过使用checkAmount = checkAmount - 40,最后一行将返回Hold(checkAmount) - (checkAmount - 40),这将始终返回40

票数 4
EN

Stack Overflow用户

发布于 2014-02-08 06:40:07

其实,你只想按你原来的说法,只收取支票金额的1%,减去40元的固定费用,所以应该是:

代码语言:javascript
复制
fee = 40 + (checkAmount - 40) * .01;

您的代码中有很多重复,这使得您很难看到正在发生的事情,如果您决定更改--例如,您想向用户显示的信息--您现在需要在4个位置更改它,并且有一个很大的变化,您忘记在某个地方做它,或者您做了一个错误。

好的方案编制的目标之一是尽可能避免重复。

代码语言:javascript
复制
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的属性。

等。

这样做的好处是,您可以分别查看每个步骤,并隔离地测试它们,这使得查找bug和维护代码变得更加容易。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21642489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档