首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用BigDecimal处理货币

使用BigDecimal处理货币
EN

Stack Overflow用户
提问于 2009-08-31 23:14:30
回答 7查看 121.6K关注 0票数 72

我试着用longs为货币创建自己的类,但显然我应该用BigDecimal代替。有人能帮我开始吗?对于美元货币,最好的使用方法是什么,比如至少设置成美分的小数点后两位,等等。BigDecimalBigDecimal很大,我不知道该用哪种方法。此外,BigDecimal具有更高的精度,但是如果它通过double,这一切不是都会丢失吗?如果我使用新的BigDecimal(24.99),它与使用double有什么不同?或者我应该使用使用String的构造函数?

EN

回答 7

Stack Overflow用户

发布于 2010-03-16 01:59:29

我建议对货币模式进行一些研究。Martin Fowler在他的书“分析模式”中更详细地介绍了这一点。

代码语言:javascript
复制
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模式,您将货币的格式化集中到一个位置。

代码语言:javascript
复制
Money price = Money.dollars(38.28);
System.out.println(price);
票数 40
EN

Stack Overflow用户

发布于 2013-04-18 05:21:14

或者,等待JSR-354。Java Money and Currency API即将推出!

票数 11
EN

Stack Overflow用户

发布于 2009-08-31 23:33:08

1)如果您受到double精度的限制,使用BigDecimals的一个原因是实现从doubles创建的BigDecimals的操作。

2) BigDecimal由一个任意精度的整数无刻度值和一个非负的32位整数小数组成,而double将一个原语类型double的值包装在一个对象中。Double类型的对象包含一个类型为double的字段

3)应该没有区别

使用$和精度应该没有问题。一种方法是使用System.out.printf

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1359817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档