Используя BigDecimal для работы с валютами

менеджер по Обновлению, заканчивающийся пространство

, Как упомянуто в комментарии, это - ошибка. Этого, как предполагается, не происходит. Удостоверьтесь, что у Вас есть 3 ГБ или больше прежде, чем выполнить обновление.

Освобождение располагает с интервалами, в то время как обновление работает

, Вы не можете использовать apt-get, так как эти update-manager уже содержит блокировки пакета. Вы также не можете вручную удалить кэш пакета, так как это, вероятно, получило все пакеты в нем, Вы только что загрузили.

Все, что можно сделать, переместить персональные данные и вручную удалить несущественные файлы:

  1. персональные данные Перемещения от Documents, Pictures и т.д. к хосту /
  2. Удаляют большие файлы в Downloads, например, ISOs
  3. Очищают Ваш кэш браузера вручную, например, ~/.mozilla/firefox/Cache или ~/cache/google-chrome/Default/Cache. Это может иногда освобождать выше на 1 ГБ.
  4. Вручную удаляют более старые ядра путем взгляда в /boot и удаления всех кроме последнего vmlinuz-..., initrd.img-..., System.map-..., abi-... и config-... (это может освободить выше на несколько сотен МБ, если у Вас есть много старых ядер).
  5. Использование использование диска анализатор для поиска больших файлов журнала или скрытых данных, которые можно удалить или переместить.

я все еще думаю, что это - просто ошибка, которая должна быть исправлена, вместо того, чтобы пытаться найти решение. Обтекание удаляющих или движущихся данных не является действительно отличным решением (и очевидно несет некоторый риск, если Вы случайно удаляете что-то существенное или личностной ценности.

65
задан mk12 13 April 2016 в 06:46
поделиться

5 ответов

Вот несколько советов:

  1. Используйте BigDecimal для вычислений, если вам нужна точность, которую он предлагает (денежные значения часто нуждаются в этом).
  2. NumberFormat класс для отображения. Этот класс позаботится о локализации сумм в разных валютах. Однако он будет принимать только примитивы; поэтому, если вы можете принять небольшое изменение точности из-за преобразования в double , вы можете использовать этот класс.
  3. При использовании класса NumberFormat используйте scale () в экземпляре BigDecimal , чтобы установить точность и метод округления.

PS: Если вам интересно, BigDecimal всегда лучше, чем ] double , когда вам нужно представить денежные значения в Java .

PPS:

Создание экземпляров BigDecimal

Это довольно просто, поскольку BigDecimal предоставляет конструкторы для получения примитивных значений и String ] объекты. Вы можете использовать их, предпочтительно тот, который принимает объект String . Например,

BigDecimal modelVal = new BigDecimal("24.455");
BigDecimal displayVal = modelVal.setScale(2, RoundingMode.HALF_EVEN);

Отображение экземпляров BigDecimal

Вы можете использовать вызовы методов setMinimumFractionDigits и setMaximumFractionDigits , чтобы ограничить количество отображаемых данных.

NumberFormat usdCostFormat = NumberFormat.getCurrencyInstance(Locale.US);
usdCostFormat.setMinimumFractionDigits( 1 );
usdCostFormat.setMaximumFractionDigits( 2 );
System.out.println( usdCostFormat.format(displayVal.doubleValue()) );
]
74
ответ дан 24 November 2019 в 15:25
поделиться

Используйте BigDecimal.setScale (2, BigDecimal.ROUND_HALF_UP) , если вы хотите округлить центы до 2 десятичных знаков. Однако помните об ошибке округления при выполнении расчетов. Вы должны быть последовательны, когда будете округлять денежную ценность. Либо сделайте округление в самом конце только один раз после того, как все вычисления будут выполнены, либо примените округление к каждому значению перед выполнением любых вычислений. Какой из них использовать, будет зависеть от требований вашего бизнеса, но в целом я думаю, что округление в самом конце кажется мне более разумным.

Используйте String при построении BigDecimal по денежной оценке. Если вы используете double , в конце будут значения с плавающей запятой.

1
ответ дан 24 November 2019 в 15:25
поделиться

1) Если вы ограничены точностью double , одной из причин использования BigDecimal является реализация операций с BigDecimal , созданными из double s.

2) BigDecimal состоит из немасштабированного целого числа произвольной точности и неотрицательной 32-битной целочисленной шкалы, в то время как double является оболочкой для значения примитивного типа. двойной в объекте. Объект типа Double содержит одно поле типа double

3) Это не должно иметь значения

У вас не должно возникнуть проблем с $ и точностью. Один из способов сделать это - использовать System.out.printf

1
ответ дан 24 November 2019 в 15:25
поделиться

На javapractices.com есть обширный пример того, как это сделать. См., В частности, класс Money , который предназначен для упрощения денежных вычислений, чем использование BigDecimal напрямую.

Дизайн этого класса Money призван сделать выражения более естественными. Например:

if ( amount.lt(hundred) ) {
 cost = amount.times(price); 
}

Инструмент WEB4J имеет аналогичный класс,

0
ответ дан 24 November 2019 в 15:25
поделиться

Я бы порекомендовал провести небольшое исследование денежного паттерна. Мартин Фаулер в своей книге «Паттерны анализа» осветил это более подробно.

public class Money {

    private static final Currency USD = Currency.getInstance("USD");
    private static final RoundingMode DEFAULT_ROUNDING = RoundingMode.HALF_EVEN;

    private final BigDecimal amount;
    private final Currency currency;   

    public static Money dollars(BigDecimal amount) {
        return new Money(amount, USD);
    }

    Money(BigDecimal amount, Currency currency) {
        this(amount, currency, DEFAULT_ROUNDING);
    }

    Money(BigDecimal amount, Currency currency, RoundingMode rounding) {
        this.currency = currency;      
        this.amount = amount.setScale(currency.getDefaultFractionDigits(), rounding);
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public Currency getCurrency() {
        return currency;
    }

    @Override
    public String toString() {
        return getCurrency().getSymbol() + " " + getAmount();
    }

    public String toString(Locale locale) {
        return getCurrency().getSymbol(locale) + " " + getAmount();
    }   
}

Переходя к использованию:

Вы должны представить все деньги, используя объект Money , а не BigDecimal . Представление денег в виде большого десятичного числа будет означать, что у вас будет возможность форматировать деньги везде, где вы их отображаете. Только представьте, изменится ли стандарт отображения. Вам придется вносить правки повсюду. Вместо использования шаблона Деньги вы централизуете форматирование денег в одном месте.

Money price = Money.dollars(38.28);
System.out.println(price);
35
ответ дан 24 November 2019 в 15:25
поделиться
Другие вопросы по тегам:

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