Как рассчитать комиссию определенным методом
У меня есть проект, над которым я работаю некоторое время, и мне нужна помощь с одним определенным методом.
Я пытаюсь подсчитать, сколько будет стоить дополнительная плата за "телефон" в гигабайтах. Я хочу, чтобы это было для каждого гигабайта больше 1,99, так что 2 и выше, это добавляет 12 долларов. Так что 2,0 - 3 - это дополнительные 12 долларов. 5,8 - 6 будет дополнительно 48 долларов
Моя логика заключается в том, что...Во-первых, мне нужно сначала определить, превышает ли значение данныхвторого раунда 1,99 ГБ значение до следующего целого числа, используя метод (Math.ceil).В-третьих, для каждого 1 числа выше 2 добавьте 12$.Четвёртое возвращение ADDITIONAL_GIG раз, сколько раз 1 ГБ было пройдено за 1,99
Вот мои конструкторы, также вызывается метод, по которому мне нужна помощь private double calcAdditionalDataFee()
import java.lang.Number;
import java.util.Locale;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Random;
import java.lang.Math;
/**
* This adds on phase 2 from phase 1 that did basic things for a phone.
*
* @author (Steven Villarreal)
* @version (2/18/19)
*/
public class MyPhone{
private int numOfTexts; //Number of texts
private boolean wifiOn; // wifi on or off (true or false).
private double amtOfDataConsum; //In MB's
private double remBattLife; //A value between 0.0 and 1.0
private String name;
private String tenDigNum;
private final double ADMIN_FEE = 0.61; //Administrative fee
private final double UNIVERSAL_USAGE = 0.03; //Universal usage charge of 3%
private final double BASE_FEE = 50.0; //Base price is $50.0
private final double ADDITIONAL_GIG = 12.0; //If user goes over 2 GB's or 2000 MB's then $12.0 is added
private final double VIDEO_DATA_PER_MIN = 250 / 60.0; //Sixty minutes of video consumes 250 MB of data
private final double AUDIO_DATA_PER_MIN = 65/ 60.0; //Sixty minutes of audio consumes 65 MB of data
private final double VIDEO_MINUTES = 480.0; //At full charge using just video, it will take 480.0 minutes till battery is 0%
private final double AUDIO_MINUTES = 900.0; //At full charge using just audio, it will take 900.0 minutes till battery is 0%
public MyPhone(String name, String tenDigNum){
this.name = name;
this.setNumber(tenDigNum);
remBattLife = 1.0; //This sets the phone battery to full charge.
amtOfDataConsum = 0.0;
numOfTexts = 0;
}
public String getName(){
return name;
}
public String getNumber(){
return tenDigNum;
}
public int getNumTexts(){
return numOfTexts;
}
public double getBatteryLife(){
return remBattLife;
}
public double getDataUsage(){
return amtOfDataConsum;
}
public void setName(String n){
name = n;
}
public void setNumber(String n){
if(n.length() == 10){
tenDigNum = n;
}
else{
tenDigNum = "9999999999";
}
}
public void sendText(){
numOfTexts += 1;
}
public void setWifi(boolean wifi){
wifiOn = wifi;
}
public boolean isWifiOn(){
return wifiOn;
}
public void readText(){
numOfTexts += 1;
int ChoiceText;
Random NewText = new Random();
ChoiceText = NewText.nextInt(5);
switch(ChoiceText){
case 0:
System.out.println("Its steve, what's up?");
break;
case 1: System.out.println("I cant believe it!");
break;
case 2: System.out.println("Get me my rubiks cube.");
break;
case 3: System.out.println("Here it comes!");
break;
case 4: System.out.println("What's the time?");
break;
}
}
public void startNewMonth(){ //Set numOfTexts to 0 and data usage to 0.
numOfTexts = 0;
amtOfDataConsum = 0.0;
}
private double calcAdditionalDataFee(){ //Come back to later.
if(amtOfDataConsum > 1.99){
}
}
private double calcUsageCharge(){
return (BASE_FEE + calcAdditionalDataFee()) * UNIVERSAL_USAGE;
}
public double calcTotalFee(){
return BASE_FEE + calcUsageCharge() + ADMIN_FEE + calcAdditionalDataFee();
}
public void streamAudio(int mins){
double battLeft = 900 * remBattLife;
if(!wifiOn){
if(mins > 0){
if(mins >= battLeft){
remBattLife = 0.0;
System.out.println("Battery is dead");
amtOfDataConsum += (65.0 * (battLeft / 60.0));
}
else{
remBattLife = (battLeft - mins) / 900;
amtOfDataConsum += (65.0 * (mins / 60.0));
}
}
else{
System.out.println("Please type in a minute greater than 0.");
}
}
else{
if(mins > 0){
if(mins >= battLeft){
remBattLife = 0.0;
System.out.println("Battery is dead");
}
else{
remBattLife = (battLeft - mins) / 900;
}
}
else{
System.out.println("Please type in a minute greater than 0.");
}
}
}
public void streamVideo(int mins){
double battLeft = 480 * remBattLife;
if(!wifiOn){
if(mins > 0){
if(mins >= battLeft){
remBattLife = 0.0;
System.out.println("Battery is dead");
amtOfDataConsum += (250.0 * (battLeft / 60.0));
}
else{
remBattLife = (battLeft - mins) / 480;
amtOfDataConsum += (250.0 * (mins / 60.0));
}
}
else{
System.out.println("Please type in a minute greater than 0.");
}
}
else{
if(mins > 0){
if(mins >= battLeft){
remBattLife = 0.0;
System.out.println("Battery is dead");
}
else{
remBattLife = (battLeft - mins) / 480;
}
}
else{
System.out.println("Please type in a minute greater than 0.");
}
}
}
public void chargeBattery(int mins){ //Charges battery, 90 minutes is full charge 45 is 50 % charge.
remBattLife = mins * (1.0/90) + remBattLife;
if(mins > 0){
if(remBattLife > 1.0){
remBattLife = 1.0;
}
System.out.println("Battery Life: " + remBattLife * 100 + "%");
}
else{
System.out.println("Please type in a minute greater than 0.");
}
}
public String fmtPhoneNumber(){ //Changes 10 digit number to a formal looking number. If over then 10 the number will be "9999999999"
String str = "(" + tenDigNum.substring(0, 3) + ")" + tenDigNum.substring(3, 6) + "-" + tenDigNum.substring(6, 10);
return str;
}
public void printStatement(){
DecimalFormat decimal = new DecimalFormat("0.00");
NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.US);
System.out.println("MyPhone Monthly Statement " +
"\n\n Customer:\t\t\t" + name +
"\n Number:\t\t\t" + fmtPhoneNumber() +
"\n Texts:\t\t\t\t" + getNumTexts() +
"\n Data usage:\t\t\t" + decimal.format(amtOfDataConsum/1000) + " (GB)" +
"\n\n 2GB Plan:\t\t\t" + currency.format(BASE_FEE) +
"\n Additional data fee:\t\t" + currency.format(ADDITIONAL_GIG) +
"\n Universal Usage (3%):\t\t" + currency.format(calcUsageCharge()) +
"\n Administrative Fee:\t\t" + currency.format(ADMIN_FEE) +
"\n Total Charges:\t\t\t" + currency.format(calcTotalFee()));
startNewMonth();
}
}
1 ответ
Я бы попробовал сделать что-то вроде этого:
private double calcAdditionalDataFee(){
//assuming its rounding UP
int RoundedDataConsumptionValue = (int) Math.round(amtOfDataConsum);
double Fee = 12*(RoundedDataConsumptionValue-1)
//Substract one in case its 2 so there will only be one fee. in case its 3 there will be 2 fees, additional logic is needed when less than 1 to avoid havin illegal values of course.
return Fee;
}