java MonetaryConversions 为高位货币抛出 ArithmeticException

标签 java currency arithmeticexception java-money

我想使用标准的 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 提供的开箱即用的转换就毫无用处,因为我无法转换很多货币。我无法想象没有人有这个问题。但是我用谷歌找不到任何东西。

最佳答案

作为dementis mentions in a comment:

Can you use the bigdecimal-based Money class?The FastMoney class is based on longs, which you shouldn't rely on for high precision currency calculations.

这对我有用。

关于java MonetaryConversions 为高位货币抛出 ArithmeticException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59181879/

相关文章:

java - 在将列表添加到 gridModel 之前对对象类列表进行排序

wpf - XAML 中的字符串格式,WPF : Currency Formatting

java - NumberFormat.getCurrencyInstance() 的货币格式基于什么标准?

java - 在 Java 中将 double 除以零

java - 为什么它暗示我要除以零?

java - 当两个线程尝试修改/访问 Concurrenthashmap 中的同一个键时会发生什么?

java - jetty 请求日志轮换 - 基于大小

java - 按索引从 Collection 中获取值(value)的最佳方式

php - 从字符串中删除欧元符号

java - try-multicatch 与 ExceptionInInitializerError 和 ArithmeticException 混淆