如何在Java中使用BigDecimal而不是double实现Excel MROUND()函数

问题描述 投票:0回答:1

如何在 Java 中四舍五入到特定倍数?在 Excel 中,有 mround 函数,可以轻松舍入到指定的倍数,如下所示:

mRound(variable,multiple)

例如这就是 Java 函数对于给定的“数字”和“因子”的工作方式。

我知道如何用 double 来完成它,但我需要使用 BigDecimal 的解决方案,因为我正在处理财务数据。

双 - 的解决方案

double mRound(double value, double factor) {
    return Math.round(value / factor) * factor;
}

这就是excel MROUND 函数的工作原理 - MROUND Excel 函数将数字四舍五入到所提供数字的最接近的倍数。您一定在想 Excel 如何知道是向上舍入还是向下舍入。这取决于除法的结果。

例如 16 / 3 = 5.33333,这里的小数值小于 0.5,因此数字 3 最接近的倍数的结果是 5,因此 3 * 5 = 15。这里,如果小数值较小,则 Excel 向下舍入 该值大于0.5。

同样,看看这个方程 20 / 3 = 6.66667。在此等式中,小数值大于 0.5,因此 Excel 将结果向上舍入为 7,因此 3 * 7 = 21。

有关 MROUND 工作原理的更多详细信息,请参阅 - https://www.wallstreetmojo.com/mround-in-excel/

java math numbers rounding bigdecimal
1个回答
0
投票

BigDecimal
类提供了与
Math.round(value / factor) * factor;
相同的所有所需方法 - 舍入有点棘手,因为
BigDecimal#round
使用需要精度的
MathContext
:是有效数字的数量,而不是数字小数部分的位数。但
BigDecimal#setScale
Math#round
的替代品。

假设

values
factor
都已经是
BigDecimal
,我们会将你的方法写为:

BigDecimal mRound(BigDecimal value, BigDecimal factor) {
    return value.divide(factor).setScale(0, RoundingMode.HALF_UP).multiply(factor);
}
© www.soinside.com 2019 - 2024. All rights reserved.