The problem
Last month Sally purchased some stock in ABC CO, Inc. Here are the details of the purchase:
- the number of shares that Joe purchased was 1,000
- When Joe purchased stock, he paid $32.87 per share
- Joe paid his stockbroker a commission that amounted to 2% of the amount he paid for the stock.
Two weeks later Joe sold the stock. Here are the details of the sale:
- the number of shares that joe sold was 1,000
- He sold the stock for $33.92 per share.
- He paid his stockbroker another commission that amounted to 2% of the amount he received for the stock.
Write a program that displays the following information:
- the amount of money Joe paid for the stock.
- the amount of commission Joe paid his broker when he bought the stock.
- the amount that Joe sold the stock for.
- the amount of commission Joe paid his broker when he sold the stock.
- display the amount of profit that Joe made after selling his stock and paying the two commissions to his broker. (if the amount of profit that your program displays is a negative number, then Joe lost money on the transaction.)
Breaking it down
Create constants
static final int NUM_SHARES = 1000; // Number of shares
static final double PURCHASE_PRICE = 32.87; // Purchase price per share
static final double SELLING_PRICE = 33.92; // Selling price per share
static final double BROKER_COMM_RATE = 0.02; // Broker commission rate
Define calculation methods
/**
* Method should calculate the purchase price of stock not including
* brokers fees.
*
* @param numberOfShares
* @param purchasePrice
* @return stock purchase price
*/
static double stockPurchasePrice (double numberOfShares, double purchasePrice) {
return numberOfShares * purchasePrice;
}
/**
* Method should calculate the brokers commission
* @param stockPurchase
* @param brokersCommissionRate
* @return brokers commission
*/
static double brokersCommission (double stockPurchase, double brokersCommissionRate) {
return stockPurchase * brokersCommissionRate;
}
/**
* Method should calculate the total amount paid which is
* sum of stock purchase price and the commission of the sale.
*
* @param stockPurchase
* @param purchaseComm
* @return total amount paid
*/
static double totalAmountPaid (double stockPurchase, double purchaseComm) {
return stockPurchase + purchaseComm;
}
/**
* Method should calculate the amount of stock sale
*
* @param numberOfShares
* @param sellingPrice
* @return stock sale amount
*/
static double stockSale (double numberOfShares, double sellingPrice) {
return numberOfShares * sellingPrice;
}
/**
* Method should calculate the commission on a sale
*
* @param numberOfShares
* @param sellingPrice
* @param brokersCommissionRate
* @return commission from the sale
*/
static double sellingCommission (double numberOfShares, double sellingPrice, double brokersCommissionRate) {
return (numberOfShares * sellingPrice) * brokersCommissionRate;
}
/**
* Method should calculate the total amount received from the sale. This amount
* is the total sale of the stock - the selling commission.
*
* @param stockSale
* @param sellingCommission
* @return total amount received from sale
*/
static double totalAmountRecieved (double stockSale, double sellingCommission) {
return stockSale - sellingCommission;
}
/**
* Method should calculate a profit or loss. If a profit was made, the amount
* will be positive. If a loss was incurred, the amount will be negative.
*
* @param amountRecieved
* @param amountPaid
* @return profit OR loss
*/
static double profitOrLoss (double amountRecieved, double amountPaid) {
return amountRecieved - amountPaid;
}
Set variables by calling calculation methods
double stockPurchase = stockPurchasePrice (NUM_SHARES, PURCHASE_PRICE);
double purchaseComm = brokersCommission (stockPurchase, BROKER_COMM_RATE) ;
double amountPaid = totalAmountPaid (stockPurchase, purchaseComm);
double stockSale = stockSale(NUM_SHARES, SELLING_PRICE);
double sellingComm = sellingCommission(NUM_SHARES, SELLING_PRICE, BROKER_COMM_RATE);
double amountRecieved = totalAmountRecieved (stockSale, sellingComm);
double profitOrLoss = profitOrLoss (amountRecieved, amountPaid);
Display results
System.out.println("You paid $" + stockPurchase + " for the stock.");
System.out.println("You paid his broker a commission of $"
+ purchaseComm + " on the purchase.");
System.out.println("So, You paid a total of $" + amountPaid + "\n");
System.out.println("You sold the stock for $" + stockSale);
System.out.println("You paid his broker a commission of $"
+ sellingComm + " on the sale.");
System.out.println("So, You recieved a total of $" + amountRecieved
+ "\n");
System.out.println("You's profit or loss: $" + profitOrLoss);
Output
You paid $32870.0 for the stock.
You paid his broker a commission of $657.4 on the purchase.
So, You paid a total of $33527.4
You sold the stock for $33920.0
You paid his broker a commission of $678.4 on the sale.
So, You recieved a total of $33241.6
You's profit or loss: $-285.8000000000029
Unit tests
@Test
public void test_totalAmountRecieved () {
assertEquals(7.5, StockTransaction.totalAmountRecieved(10d, 2.50), 0);
}
@Test
public void test_totalAmountPaid () {
assertEquals(12.5, StockTransaction.totalAmountPaid(10d, 2.50), 0);
}
@Test
public void test_stockSale () {
assertEquals(25, StockTransaction.stockSale(10d, 2.50), 0);
}
@Test
public void test_stockPurcasePrice () {
assertEquals(25, StockTransaction.stockPurchasePrice(10d, 2.50), 0);
}
@Test
public void test_profitORLoss_positive () {
assertEquals(100, StockTransaction.profitOrLoss(200, 100), 0);
}
@Test
public void test_profitORLoss_negative () {
assertEquals(-100, StockTransaction.profitOrLoss(100, 200), 0);
}
@Test
public void test_selling_commission () {
assertEquals(150, StockTransaction.sellingCommission(150, 50, .02), 0);
}
@Test
public void test_brokers_commission () {
assertEquals(5000, StockTransaction.brokersCommission(100, 50), 0);
}
Level Up
- Format ouput using number formatter
- Modify the program to prompt the user to enter in number of shares, purchase price, selling price and broker rate
- have fun by adding a particular message for profit. For instnace, if someone lost more than 15% in the sale of the stock, then display a message 'Rough day - want to come over for a beer?'. Vise versa, in the event they had a killer day > 20 %, display a message 'Where we going out for dinner!'
- Include the % of gain or loss percentage similar message to profit, if a user is using a broker that has a commission rate of > X% 'hey you have heard of tdameritrade, right?'