У меня проблемы с форматированием вывода в моей программе

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

Сначала код выплевывал 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

Взгляните на DecimalFormat docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.ht‌ мл

Jens 11.01.2019 22:44

@Jens Я думаю, это сработает, но есть проблема. Я не могу отформатировать итоговую сумму из-за прикрепленной строки. Мне не разрешено избавляться от строки, потому что мой учитель сказал, что мне нужно добавить «Итого: $» к ответу. Я могу что-нибудь сделать.

Lucas Kopp 11.01.2019 23:11

Вы можете использовать форматировщик символов внутри метода String.format (). Я отвечу на этот вопрос, если не засну через 20 минут.

Taslim Oseni 12.01.2019 01:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
24
1

Ответы 1

В вашем конкретном случае (ваш метод возвращает строку) один из способов сделать это - использовать метод Строка # формат (), как это коснулся @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 # формат (), как уже упоминал @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, используется, чтобы ваше числовое значение было представлено в числовом формате вашей конкретной страны.

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

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());

}

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

Другие вопросы по теме

Похожие вопросы

Массовая загрузка в Box * с использованием Java
Связь Jar с локальным файлом проекта
ArrayList говорит, что мой метод не может быть преобразован в ArrayList (несовместимый тип)
JPA - сгенерированный запрос для метода сохранения не вставляет все столбцы
Spring Boot JPA: передача нескольких значений для одного и того же параметра (JPQL)
Spring Безопасность и проверка подлинности inMemory () и недопустимые учетные данные
POST в JAVA с использованием HttpURLConnection, получение кода ответа HTTP 400
Android WifiP2PService java.IllegalArgumentException: нулевое устройство, вызывающее случайную перезагрузку телефона
JMonthChooser показывает, что возвращает целочисленное значение месяца, но всегда возвращает 01 как значение при выборе любого месяца
Пользовательский интерфейс Firebase: решение для получения всех ключей от дочернего элемента и использования его для получения информации от другого узла и заполнения ее в Recyclerview?