У меня проблемы с форматированием вывода в моей программе - PullRequest
0 голосов
/ 12 января 2019

Код не форматируется правильно

Сначала код выдавал 1.0, когда я хотел 1.00. Итак, я использовал оператор if, чтобы это исправить. Тогда код даст .5, а не .50, поэтому я попробовал то же самое решение, но оно не сработало. Мне было интересно, смогу ли я создать средство форматирования, которое добавило бы дополнительный 0, если бы справа от десятичного числа был только один номер, чтобы решить мою проблему.

    import java.util.Scanner;

public class addCoins {
    public static void main(String[] args) {
        int quarters, dimes, nickels, pennies;

        Scanner input = new Scanner(System.in);

        System.out.println("Enter in your total coins: ");

        System.out.println();

        System.out.print("Quarters: ");
        quarters = input.nextInt();
        System.out.print("Dimes: ");
        dimes = input.nextInt();
        System.out.print("Nickels: ");
        nickels = input.nextInt();
        System.out.print("Pennies: ");
        pennies = input.nextInt();

        System.out.println();

        System.out.println(dollarAmount(quarters, dimes, nickels, pennies));
    }

    public static String dollarAmount(int quarters2, int dimes2, int nickels2, int pennies2) {

        double total = (quarters2 * .25) + (dimes2 * .10) + (nickels2 * .05) + (pennies2 * .01);

        if (total % 1.0 == 0 || total % .10 == .0) {
            return "Total: $" + total + "0";
        } else {
            return "Total: $" + total;
        }
    }

}

.5 вместо .50

1 Ответ

0 голосов
/ 12 января 2019

В вашем конкретном случае (ваш метод возвращает строку), вы можете сделать это одним из способов, используя метод String # format () , о котором говорил @Taslim, он будет выглядеть примерно так :

public static String dollarAmount(int quarters2, int dimes2, int nickels2, int pennies2) {
    double total = (quarters2 * .25) + (dimes2 * .10) + (nickels2 * .05) + (pennies2 * .01);
    return String.format("Total: $%.2f", total);
}

Еще один способ заключается в использовании метода DecimalFormat # format () , как уже упоминалось @Jens, и он будет выглядеть примерно так:

public static String dollarAmount(int quarters2, int dimes2, int nickels2, int pennies2) {
    double total = (quarters2 * .25) + (dimes2 * .10) + (nickels2 * .05) + (pennies2 * .01);
    DecimalFormat df = new DecimalFormat(".##", DecimalFormatSymbols.getInstance(Locale.US));
    return "Total: $" + df.format(total);
}

DecimalFormatSymbols.getInstance (Locale.US) , который вы видите в инициализации переменной DecimalFormat, используется для того, чтобы ваше числовое значение было представлено в числовом формате вашей конкретной страны.

И еще один, более длинный способ сделать это для меньших значений - использовать методы Math # pow () и Math # round () , например:

public static String dollarAmount(int quarters2, int dimes2, int nickels2, int pennies2) {
    double total = (quarters2 * .25) + (dimes2 * .10) + (nickels2 * .05) + (pennies2 * .01);

    long factor = (long) Math.pow(10, 2); // 2 is the decimal places
    total = total * factor;
    long tmp = Math.round(total);
    return "Total: $" + String.valueOf((double) tmp / factor);
}

Для больших и более сложных значений, возможно, вы захотите сделать это, используя BigDecimal # setScale () метод, который обеспечивает гораздо большую точность при выполнении вычислений со значениями типа данных Float или Double (, которые являются неточными ) .... как-то так:

public static String dollarAmount(int quarters2, int dimes2, int nickels2, int pennies2) {
    double total = (quarters2 * .25) + (dimes2 * .10) + (nickels2 * .05) + (pennies2 * .01);

    BigDecimal bd = new BigDecimal(total);
    // The 2 used below is the decimal places. You can
    // use whatever rounding mode you want.
    bd = bd.setScale(2, RoundingMode.HALF_UP); 
    return "Total: $" + String.valueOf(bd.doubleValue());

}

Сделай свой выбор;)

...