我试着用longs为货币创建自己的类,但显然我应该用BigDecimal
代替。有人能帮我开始吗?对于美元货币,最好的使用方法是什么,比如至少设置成美分的小数点后两位,等等。BigDecimal
的BigDecimal
很大,我不知道该用哪种方法。此外,BigDecimal
具有更高的精度,但是如果它通过double
,这一切不是都会丢失吗?如果我使用新的BigDecimal(24.99)
,它与使用double
有什么不同?或者我应该使用使用String
的构造函数?
发布于 2010-03-16 01:59:29
我建议对货币模式进行一些研究。Martin Fowler在他的书“分析模式”中更详细地介绍了这一点。
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
模式,您将货币的格式化集中到一个位置。
Money price = Money.dollars(38.28);
System.out.println(price);
发布于 2013-04-18 05:21:14
或者,等待JSR-354。Java Money and Currency API即将推出!
发布于 2009-08-31 23:33:08
1)如果您受到double
精度的限制,使用BigDecimal
s的一个原因是实现从double
s创建的BigDecimal
s的操作。
2) BigDecimal
由一个任意精度的整数无刻度值和一个非负的32位整数小数组成,而double将一个原语类型double
的值包装在一个对象中。Double
类型的对象包含一个类型为double
的字段
3)应该没有区别
使用$和精度应该没有问题。一种方法是使用System.out.printf
https://stackoverflow.com/questions/1359817
复制相似问题