【问题标题】:java MonetaryConversions throws ArithmeticException for high digit currenciesjava MonetaryConversions 为高位数货币抛出 ArithmeticException
【发布时间】:2019-12-04 17:38:47
【问题描述】:

我想使用标准的 java MonetaryConversions 来转换货币。

乍一看,它工作得很好而且很简单:

    @Test
    public void testConversion()
    {
        FastMoney usd = FastMoney.of(1000, Monetary.getCurrency("USD"));
        usd.with(MonetaryConversions.getConversion("EUR"));
    }

但是,当我使用日元或墨西哥比索等名义价值较高的货币时,我发现这会引发 ArithmeticExceptions

    @Test
    public void testArithmeticException()
    {
        FastMoney jpy = FastMoney.of(1000, Monetary.getCurrency("JPY"));
        jpy.with(MonetaryConversions.getConversion("EUR"));
    }

抛出以下异常

java.lang.ArithmeticException: 0.0082769 can not be represented by this class, scale > 5

    at org.javamoney.moneta.FastMoney.getInternalNumber(FastMoney.java:197)
    at org.javamoney.moneta.FastMoney.multiply(FastMoney.java:388)
    at org.javamoney.moneta.FastMoney.multiply(FastMoney.java:84)
    at org.javamoney.moneta.spi.AbstractCurrencyConversion.apply(AbstractCurrencyConversion.java:118)
    at org.javamoney.moneta.FastMoney.with(FastMoney.java:594)
    at tech....GatewayTransactionConverterTest.testArithmeticException(GatewayTransactionConverterTest.java:207)

检查 FastMoney 的代码,我发现异常是硬编码的,我找不到任何可以减少的地方,例如规模。

但是有了这个,Java 提供的开箱即用的转换是毫无用处的,因为我无法转换很多货币。我无法想象没有人有这个问题。但我在谷歌上找不到任何东西。

【问题讨论】:

  • 您可以使用基于 bigdecimal 的 Money 类吗?FastMoney 类基于多头,您不应该依赖它来进行高精度货币计算。
  • 就是这样。非常感谢!不知道为什么我们一直在使用 FastMoney ... 会改变这一点。

标签: java currency arithmeticexception java-money


【解决方案1】:

作为dementis mentions in a comment:

您可以使用基于 bigdecimal 的 Money 类吗?FastMoney 类基于 long,您不应该依赖它来进行高精度货币计算。

这对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 2016-04-20
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    相关资源
    最近更新 更多