Merge pull request #4052 from axinss/v5-dev

处理 #4051 提到的意见
This commit is contained in:
Golden Looly 2025-09-04 09:11:05 +08:00 committed by GitHub
commit 643b65ee5b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 26 additions and 2 deletions

View File

@ -2549,7 +2549,7 @@ public class NumberUtil {
/**
* 提供精确的幂运算<br>
* 如果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);
}
/**
* 提供精确的幂运算<br>
* 如果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);
}

View File

@ -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");