gpt4 book ai didi

Java BigDecimal 是否需要进行加法舍入?

转载 作者:行者123 更新时间:2023-11-30 06:29:10 27 4
gpt4 key购买 nike

我正在使用BigDecimal,我知道如果我除法,我必须使用MathContext并告诉哪个ScaleRoundingMode 以避免 ArithmeticException 如文档中所述:

In the case of divide, the exact quotient could have an infinitely long decimal expansion; for example, 1 divided by 3. If the quotient has a nonterminating decimal expansion and the operation is specified to return an exact result, an ArithmeticException is thrown.

在我正在研究的方法中,我必须将来 self 们数据库的金额(四舍五入为小数点后两位)与来自外部服务的金额相加,并且我不知道这些金额的确切比例(可能是3 位小数)。

我的问题是,我是否可以信任 BigDecimal 的 add 方法并在不进行舍入和缩放的情况下使用它,或者始终指定所需的比例是一个好习惯?

是否存在加法和减法可能引发 ArithmeticException 的特殊情况?

最佳答案

如果结果的小数位数不适合 int

BigDecimal.add() 将抛出 ArithmeticException

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

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 将产生一个与 presize 结果相差任意值的结果,但内存和速度将更可预测。

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

关于Java BigDecimal 是否需要进行加法舍入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46489149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com