BigDecimal 接受前端传过了的小数报错 Non-terminating decimal expansion; no exact representable decimal result.
时间: 2023-11-17 22:04:13 浏览: 263
出现这个异常的原因是在进行除法运算时,可能会出现无限循环小数,而 BigDecimal 是精确计算的,无法表示无限循环小数,因此会抛出这个异常。解决这个问题的方法是在进行除法运算时,指定舍入模式,例如ROUND_HALF_UP,这样可以将结果舍入到指定的位数,避免出现无限循环小数。以下是一个示例代码:
```java
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Test {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("3");
BigDecimal c = a.divide(b, 2, RoundingMode.HALF_UP);
System.out.println(c);
}
}
```
在这个示例代码中,我们将 1 除以 3,并将结果保留两位小数,使用了舍入模式 ROUND_HALF_UP。这样可以避免出现无限循环小数,输出结果为 0.33。
相关问题
BigDecimal报错Non-terminating decimal expansion; no exact representable decimal result.如何解决
BigDecimal报这个错误通常是因为你在处理浮点数时遇到了精度问题,因为BigDecimal是一个精确的十进制算术库,它不能表示所有实数的小数部分,特别是那些无限循环小数。解决这个问题的方法有:
1. **设置最大精度**:你可以指定一个最大位数来截断结果。例如,`new BigDecimal(yourValue).setScale(maxPrecision, RoundingMode.HALF_UP)`,这里的`maxPrecision`是你想要的结果的最大小数位数。
2. **舍入规则**:使用RoundingMode类中的策略进行四舍五入,比如`RoundingMode.HALF_UP`、`RoundingMode.FLOOR`或`RoundingMode.CEILING`等。
3. **检查输入数据**:如果可能的话,确保提供给BigDecimal的数值是可以准确表示的有限小数,避免处理无穷递归的情况。
4. **转换为字符串**:如果你只是需要展示结果而不是进行复杂的计算,可以将BigDecimal转换为String形式。
5. **检查溢出**:确保你的运算不会导致过大或过小的数值超出了BigDecimal所能表示的范围。
记得在使用时要考虑业务需求的实际精度,并适当处理可能出现的异常。
java bigdecimal类型除法报错Non-terminating decimal expansion; no exact representable decimal result.如何解决
当在Java中使用`BigDecimal`进行除法运算,如果结果不是精确的十进制数(如0.1/3),可能会遇到"Non-terminating decimal expansion; no exact representable decimal result"这样的错误。这是因为`BigDecimal`无法准确表示所有实数,尤其是那些非循环小数。
解决这个问题通常有几种方法:
1. **舍入模式设置**:使用`setScale()`方法设定保留的小数位数,并指定舍入模式,如`RoundingMode.HALF_UP`(向上取整)或`RoundingMode.DOWN`(向下取整)。
```java
BigDecimal quotient = dividend.divide(divisor, scale, RoundingMode.HALF_UP);
```
2. **四舍五入到无限小数**:虽然这不是标准做法,但在某些特定场景下,可以明确指定想要的结果是近似值,比如只保留几位小数。
3. **转换成分数形式**:如果除数和结果都可以简化为有限小数,可以先转换为分数形式再做计算。
4. **使用`BigInteger`**:如果需要高精度整数的除法,可以考虑使用`BigInteger`,它同样支持除法操作。
```java
BigInteger biDividend = new BigInteger(dividend.toString());
BigInteger biDivisor = new BigInteger(divisor.toString());
BigDecimal result = biDividend.divide(biDivisor, new MathContext(10)); // 10表示最大精度
```
阅读全文