[英]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
對象,該對象具有checkAmount
, fee
, feeStructure
和payoutAmount
。
等等。
令人高興的是,您可以分別查看每個步驟並單獨進行測試,這使查明錯誤和維護代碼變得更加容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.