Java BigDecimal是否需要进行舍入?

时间:2017-09-29 12:47:15

标签: java bigdecimal

我正在与BigDecimal合作,我知道如果我分开,我必须使用MathContext并告诉我ScaleRoundingMode避免ArithmeticException在文档中描述:

  

在除法的情况下,准确的商可以无限   长十进制扩展;例如,1除以3.如果商   具有非终止十进制扩展并指定操作   要返回精确的结果,抛出ArithmeticException。

在我正在研究的方法中,我必须总结来自我们数据库的数据(以小数点后2位舍入),其中来自外部服务的金额,我不知道这些金额的确切比例(概率) 3位小数)。

我的问题是,我可以信任BigDecimal的添加方法并使用它而不需要舍入和缩放,或者总是指定所需的比例是一个好习惯吗?

是否有任何特殊情况下加法和减法可以引发ArithmeticException

1 个答案:

答案 0 :(得分:1)

如果结果的比例不适合BigDecimal.add(),则

ArithmeticException会抛出int

一个简单的例子是添加两个具有最大和最小比例的数字:

BigDecimal a = new BigDecimal(BigInteger.ONE, Integer.MIN_VALUE);
BigDecimal b = new BigDecimal(BigInteger.ONE, Integer.MAX_VALUE);
a.add(b);

如果您的应用程序需要以比例运行,那么您可能会遇到一些更大的问题而不是担心算术异常。

不使用MathContext添加数字将保持适当的比例并为您提供精确的结果。根据实际值,此方法可以使用任意数量的内存来表示越来越长的数字,而更长的数字则需要更多时间来添加。

在不使用MathContext的情况下添加数字并在求和之后进行一次编辑将为您提供舍入到请求的MathContext的精确结果。内存和计算成本与第一种情况相同。

每次添加使用MathContext将产生一个结果,该结果可以通过任意值与预设结果不同,但内存和速度将更具可预测性。

选择使用哪种方法实际上取决于任务的性质,因此您需要为每种特定情况评估和选择正确的方法。