BigDecimal 接受前端传过了的小数报错 Non-terminating decimal expansion; no exact representable decimal result.
时间: 2023-11-17 14:04:13 浏览: 39
出现这个异常的原因是在进行除法运算时,可能会出现无限循环小数,而 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。
相关问题
java 报错Non-terminating decimal expansion; no exact representable decimal result.
这个错误通常出现在使用 BigDecimal 类进行计算时,表示计算结果是一个无限循环小数,无法精确表示成一个有限的十进制数。解决这个问题的方法是使用 BigDecimal 的 setScale 方法设置计算结果的小数点位数,从而避免出现无限循环小数。例如:
```
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = a.add(b);
c = c.setScale(2, RoundingMode.HALF_UP); // 设置小数点后2位,四舍五入
System.out.println(c); // 输出 0.30
```
请注意,使用 setScale 方法会改变 BigDecimal 对象的值,因此需要将结果赋值给一个新的 BigDecimal 对象。
kotlin BigDecimal() 报错 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
在Kotlin中,BigDecimal是一个用于处理高精度数值计算的类。当使用BigDecimal进行计算时,有时会出现java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result的错误。
这个错误通常是由于无法精确表示某些十进制数而导致的。例如,当使用除法操作时,如果结果是一个无限循环的小数,BigDecimal将无法准确表示该结果。
为了解决这个问题,可以使用BigDecimal的setScale()方法来设置精度和舍入模式。setScale()方法接受两个参数:精度和舍入模式。精度指定了保留的小数位数,而舍入模式指定了如何处理多余的小数位。
下面是一个示例代码,演示了如何使用BigDecimal并处理可能出现的异常:
```kotlin
import java.math.BigDecimal
import java.math.RoundingMode
fun main() {
val dividend = BigDecimal(1)
val divisor = BigDecimal(3)
try {
val result = dividend.divide(divisor, 2, RoundingMode.HALF_UP)
println("Result: $result")
} catch (e: ArithmeticException) {
println("Error: ${e.message}")
}
}
```
在上面的示例中,我们使用divide()方法进行除法运算,并设置精度为2位小数,舍入模式为HALF_UP。如果除法运算结果无法精确表示,则会抛出ArithmeticException异常,并打印错误消息。