Java 使用Spring SpelExpressionParser进行数学字符串计算-值太大

Java 使用Spring SpelExpressionParser进行数学字符串计算-值太大,java,spring,math,Java,Spring,Math,我们使用spring“SpelExpressionParser”来执行字符串中提供的一些数学操作。 这是可行的,但也有一些问题 如果数学字符串中的一个数字比“int”长,我们必须在数字后面写一个“L”。如果没有,解析器将抛出一个异常(数字格式例外)。那不好,因为我们得把字符串分开,然后自己在数字后面写上一个“L”。是否有一个选项可以让解析器自动使用正确的数据类型 这提供了一个错误 操作:(-8069324632329525206)*2 错误:由以下原因引起:java.lang.NumberFor

我们使用spring“SpelExpressionParser”来执行字符串中提供的一些数学操作。 这是可行的,但也有一些问题

如果数学字符串中的一个数字比“int”长,我们必须在数字后面写一个“L”。如果没有,解析器将抛出一个异常(数字格式例外)。那不好,因为我们得把字符串分开,然后自己在数字后面写上一个“L”。是否有一个选项可以让解析器自动使用正确的数据类型

这提供了一个错误

操作:(-8069324632329525206)*2

错误:由以下原因引起:java.lang.NumberFormatException:对于输入字符串:“8069324632329525206”

这不会产生错误,但会产生错误的结果

操作:(-8069324632329525206L)*2

结果:2308094809050501204

正如你现在看到的,我们没有更多的错误,但是我们的结果是错误的。似乎解析器正在使用“长”数据类型进行计算,我们的结果可能超出范围。在我看来,得到一个错误的结果是不好的。应该会抛出一个错误

所以我的问题是:
有没有另一个好的数学表达式解析器,它可以使用“BigDecimal”或兼容的数据类型,这样我就可以用非常大的数字进行数学计算?或者是否有一个选项可以正确配置spring解析器?

解决此问题的一种方法是在表达式中显式使用
biginger

#{new java.math.BigInteger("8069324632329525206").multiply(2)}
将计算

16138649264659050412

我试过了。这也是可行的:newjava.math.BigDecimal(“-8069324632329525206.34”)*2但我们有这样的情况,用户可以编写自己的复杂数学表达式。这意味着我需要编辑这个表达式并用一个新的biginteger或bigdecimal实例字符串替换大于“int”的数字,如您所示。我希望会有一个更简单的方法或一个好的库自动使用正确的类型。但是谢谢,至少这会帮助我。