diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 476535ba3..f5cbe0256 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -2549,7 +2549,7 @@ public class NumberUtil { /** * 提供精确的幂运算
- * 如果n为负数,则返回1/a的-n次方,默认四舍五入 + * 如果n为负数,则返回1/a的-n次方,默认四舍五入,保留两位小数 * * @param number 底数 * @param n 指数,如果为负数,则返回1/a的-n次方 @@ -2557,9 +2557,25 @@ public class NumberUtil { * @since 4.1.0 */ public static BigDecimal pow(BigDecimal number, int n) { + return pow(number, n, 2, RoundingMode.HALF_UP); + } + + + /** + * 提供精确的幂运算
+ * 如果n为负数,则返回1/a的-n次方,默认四舍五入 + * + * @param number 底数 + * @param n 指数,如果为负数,则返回1/a的-n次方 + * @param scale 保留的小数位 (指数为负数时生效) + * @param roundingMode 保留小数的模式 {@link RoundingMode} (指数为负数时生效) + * @return 幂的积 + * @since 4.1.0 + */ + public static BigDecimal pow(BigDecimal number, int n, int scale, RoundingMode roundingMode) { if (n < 0) { // a的n次方,如果n为负数,则返回1/a的-n次方 - return BigDecimal.ONE.divide(pow(number, -n), 2, RoundingMode.HALF_UP); + return BigDecimal.ONE.divide(pow(number, -n), scale, roundingMode); } return number.pow(n); } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index 145ad5bb6..528da7adf 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -660,6 +660,14 @@ public class NumberUtilTest { assertEquals(expected, NumberUtil.pow(number, exponent)); } + @Test + public void testPowSmallNumberScale() { + BigDecimal number = new BigDecimal("1.2"); + int exponent = -3; + BigDecimal expected = new BigDecimal("0.58"); + assertEquals(expected, NumberUtil.pow(number, exponent)); + } + @Test public void issue3636Test() { final Number number = NumberUtil.parseNumber("12,234,456");