【发布时间】:2014-06-29 04:27:24
【问题描述】:
尝试从 MySQL 数据库读取的 BigDecimal 中创建 Joda-Money Money 对象会引发错误。
这段代码:
PreparedStatement p_stmt = ...;
ResultSet results = ...;
Money amount = Money.of(CurrencyUnit.USD, results.getBigDecimal("amount"));
抛出这个:
java.lang.ArithmeticException: Scale of amount 1.0000 is greater than the scale of the currency USD
at org.joda.money.Money.of(Money.java:74)
at core.DB.getMoney(DB.java:4821)
我实际上已经通过添加四舍五入解决了错误:
Money amount = Money.of(CurrencyUnit.USD, results.getBigDecimal("amount"), RoundingMode.HALF_UP);
但是,我对这种解决方案持怀疑态度。是最好的吗?
我正在使用DECIMAL(19,4) 按照this SO answer 将货币值存储在数据库中。老实说,这让我有点困惑,为什么那里的回答者要求在 DB 上精确到小数点后 4 位,但我倾向于相信高价值的答案,我认为他们知道他们在说什么,我会后悔没有关注他们的建议。然而,Joda-Money 不喜欢美国货币的小数点后 4 位精度。也许DECIMAL(19,4) 是他们需要小数点后 4 位精度的国际标准?不确定..
为了让问题简洁:
-
RoundingMode.HALF_UP是解决此错误的理想解决方案吗? - 是否应该将 MySQL DB 上的精度从
DECIMAL(19,4)更改为DECIMAL(19,2)? - 有没有办法改变 Joda-Money 的精度?如果是:我应该这样做吗?
【问题讨论】:
标签: java mysql jdbc joda-money