Как рассчитать комиссию определенным методом

У меня есть проект, над которым я работаю некоторое время, и мне нужна помощь с одним определенным методом.

Я пытаюсь подсчитать, сколько будет стоить дополнительная плата за "телефон" в гигабайтах. Я хочу, чтобы это было для каждого гигабайта больше 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;        
}
Другие вопросы по тегам