Java Установите двойное значение со всей десятичной точкой и получите только 2 цифры после десятичной точки - PullRequest
0 голосов
/ 28 сентября 2018

В Java у меня путаница с магазином и я получаю двойное значение.В настоящее время я создаю программное обеспечение, в которое включена некоторая учетная часть, я хочу сохранить вычисленное значение таким же, как они рассчитываются как 202.234234234212312, и в то время как на дисплее я хочу отображать его как 202.23 в 2-х значном виде после десятичной точки.и в расчете я хочу сделать расчет с 2,4 или 6 цифрой.

для этого у меня есть 2 варианта

  1. Сохранить значение, как оно рассчитывается и в методе полученияполя количества, я могу отформатировать его как.

    private Double amount;
    public Double getAmount() {
        DecimalFormat df2 = new DecimalFormat(".##");
        return Double.valueOf(df2.format(amount));
    }
    

, но проблема этого метода в том, что он будет получать отформатированное число в любое время, когда я получу сумму.я не могу получить фактически сохраненную сумму.

я могу использовать 2 отдельных поля для получения и установки.

private Double amount;
private Double amountFormatted;

public Double getAmount() {
    return amount;
}

public Double getAmountFormatted() {
    DecimalFormat df2 = new DecimalFormat(".##");
    return Double.valueOf(df2.format(amountFormatted));
}

, поэтому, пожалуйста, предоставьте лучший способ хранения и получения десятичного значения, спасибо.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Прежде всего, все расчеты, связанные с деньгами, должны выполняться в BigDecimal, а не в двойном размере.Двойное число не может точно представлять такие значения, как 0,1.

Во-вторых, ваш getAmountFormatted не должен возвращать Double, а String, если он предназначен только для целей вывода.

Используйте ту же переменную количества дляоба метода.

0 голосов
/ 28 сентября 2018

Не задача организации предоставлять отформатированные данные для отображения: оставьте форматирование для кода, который фактически выполняет отображение.Более того, это не ваша работа программиста класса сущностей: 1) предвидеть каждую будущую потребность в отформатированном значении и 2) постоянно обновлять класс сущности для предоставления новых отформатированных значений, которые вы не делали't (нет, не мог ) предвидеть.

Поэтому просто метод getAmount возвращает необработанные необработанные данные:

public class Entity {
    private BigDecimal amount;
    public BigDecimal getAmount(){ 
        return amount;
    }
    //...

}

и исключает getAmountFormatted из сущности.Если вы хотите отобразить сумму, отформатированную с точностью до двух знаков после запятой, просто получите необработанную сумму с помощью getAmount() и отформатируйте ее прямо на месте:

Entity e = ...;
DecimalFormat df = new DecimalFormat(".##");
System.out.println("The amount is " + df.format(e.getAmount());

Вот небольшая история, которая иллюстрирует, почему я думаю, что этопуть ...

Предположим, что в вашей сущности есть секунда сумма, otherAmount, которая была включена в момент создания сущности, потому что кто-то думал, что может будет необходимо в будущем.И предположим, что из-за того, что в то время поле не планировалось использовать, вы не удосужились создать метод getOtherAmountFormatted() для предоставления версии otherAmount в двух десятичном формате.

Теперь наступает будущее.Поле otherAmount теперь используется, и вам нужно начать отображать его с двумя десятичными знаками вместе с оригинальным amount.Вы знаете, что вам нужно будет добавить строку

System.out.println("The other amount is " + ...

в код, который отображает суммы.Вопрос только в том, как вы закончите эту линию.Вы добавляете в свой класс сущностей метод getOtherAmountFormatted() и затем пишете:

 System.out.println("The other amount is " + e.getOtherAmountFormatted());  // NO!!

Или вы вообще не касаетесь класса сущностей и просто пишете:

 System.out.println("The other amount is " + df.format(e.getOtherAmount()); // Yes!!

Сущность не является классом, которому в конечном итоге требуется отформатированная версия otherAmount, поэтому ее не нужно менять, чтобы приспособиться к совсем другому фрагменту кода, который сейчас нуженотформатированная версия otherAmount.Особенно, когда этот другой бит кода может просто получить неформатированное количество, которое немодифицированный объект может уже предоставить, а затем выполнить необходимое форматирование для себя.

Следующий сценарий: в будущем, появилось еще одно требование для печати этих полей суммы, но теперь с тремя десятичными знаками.Собираетесь ли вы добавить еще больше методов в класс сущностей, чтобы обеспечить трехзначные версии сумм (в дополнение к тем, которые уже предоставляют двухзначные версии)?Или вы вообще не будете касаться класса сущностей и просто напишите, в тот момент, когда вам понадобятся эти три десятичные отформатированные значения:

DecimalFormat df3 = new DecimalFormat(".###");
// ...
System.out.println("The amount in 3 decimals is " + df3.format(e.getAmount());
System.out.println("The other amount in 3 decimals is " + df3.format(e.getOtherAmount());
0 голосов
/ 28 сентября 2018

Если я вас правильно понял, вы просто хотите получить другой формат для одного и того же значения, у вас может быть только одна переменная и 2 поля, например:

private Double amount;

public Double getAmount() {
    return amount;
}

public Double getAmountFormatted() {
    DecimalFormat df2 = new DecimalFormat(".##");
    return Double.valueOf(df2.format(amount));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...