使用 BigDecimal 处理货币

2022-08-31 13:49:09

我试图用多头为货币制作自己的类,但显然我应该使用。有人可以帮助我入门吗?将s用于美元货币的最佳方法是什么,例如至少但不超过2位小数的美分等。的API是巨大的,我不知道该使用哪种方法。此外,具有更好的精度,但是如果它通过一个?如果我做新的,它与使用一个有什么不同?或者我应该使用使用的构造函数来代替?BigDecimalBigDecimalBigDecimalBigDecimaldoubleBigDecimal(24.99)doubleString


答案 1

以下是一些提示:

  1. 如果您需要计算它提供的精度(货币值通常需要它)。BigDecimal
  2. 使用数字格式类进行显示。本课程将处理不同货币金额的本地化问题。但是,它将只接受基元;因此,如果可以接受由于转换为 a 而导致的精度的微小变化,则可以使用此类。double
  3. 使用类时,请在实例上使用该方法来设置精度和舍入方法。NumberFormatscale()BigDecimal

PS:如果您想知道,当您必须在Java中表示货币价值时,BigDecimal总是比double更好

缴费灵:

创建大十进制实例

这相当简单,因为 BigDecimal 提供了用于接收基元值和对象的构造函数。您可以使用它们,最好是采用 String 对象的那个。例如String

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

显示大十进制实例

可以使用 and 方法调用来限制显示的数据量。setMinimumFractionDigitssetMaximumFractionDigits

NumberFormat usdCostFormat = NumberFormat.getCurrencyInstance(Locale.US);
usdCostFormat.setMinimumFractionDigits( 1 );
usdCostFormat.setMaximumFractionDigits( 2 );
System.out.println( usdCostFormat.format(displayVal.doubleValue()) );

答案 2

我建议对货币模式进行一些研究。Martin Fowler在他的《Analysis pattern》一书中更详细地介绍了这一点。

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

即将使用:

您将使用对象而不是 来表示所有资金。将货币表示为大十进制将意味着您将在显示货币的每个位置格式化货币。想象一下,如果显示标准发生变化。您将必须到处进行编辑。相反,使用这种模式,您可以将货币的格式集中到一个位置。MoneyBigDecimalMoney

Money price = Money.dollars(38.28);
System.out.println(price);