要怎么改main,才能去掉以下错误Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(BigDecimal.java:1707) at com.yuxue.core.PlateRecognition.main(PlateRecognition.java:118)主函数如下 public static void main(String[] args) { // 多张车牌图片路径 String[] imgPaths = {"res/image/test_image/plate_locate.jpg", "res/image/test_image/test.jpg", "res/image/test_image/plate_detect.jpg"}; int sum = imgPaths.length; // 总共处理的图片数量 int errNum = 0; // 识别错误的数量 int sumTime = 0; // 总耗时 long longTime = 0; // 最长处理时长 for (int i = 0; i < sum; i++) { opencv_core.Mat src = opencv_imgcodecs.imread(imgPaths[i]); String[] ret = multiPlateRecognise(src); long now = System.currentTimeMillis(); System.err.println(Arrays.toString(ret)); long s = System.currentTimeMillis() - now; if (s > longTime) { longTime = s; } sumTime += s; boolean flag =false;//是否有一个车牌号识别错误 for (String plate:ret) { if (plate != null && !"苏EUK722".equals(plate) && !"苏AOCP56".equals(plate) && !"沪BS781".equals(plate)) { flag = true; break; } } if (flag) { errNum++; } } BigDecimal errSum = new BigDecimal(errNum); BigDecimal sumNum = new BigDecimal(sum); BigDecimal c = sumNum.subtract(errSum).divide(sumNum).multiply(new BigDecimal(100)); System.err.println("总耗时:" + sumTime + "ms,平均处理时长:" + sumTime / (sum * 3) + "ms,错误数量:" + errNum + ",正确识别率:" + c + "%"); } }
时间: 2024-02-14 09:16:13 浏览: 17
这个错误是由于在执行BigDecimal的除法运算时,出现了非终止小数扩展的情况,导致无法精确表示结果。为了解决这个问题,你可以使用divide方法的重载形式,指定小数位数和舍入规则,示例代码如下:
```
BigDecimal errSum = new BigDecimal(errNum);
BigDecimal sumNum = new BigDecimal(sum);
BigDecimal c = sumNum.subtract(errSum).divide(sumNum, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
```
这里使用了RoundingMode.HALF_UP表示采用四舍五入的方式进行舍入,2表示保留2位小数。
相关问题
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
这个错误信息通常是由于在Java中进行除法运算时,结果是一个无限循环的小数,而Java无法准确地表示这个小数,因此会抛出此异常。这种情况通常发生在除数为0的情况下。
解决此问题的方法是使用Java中的BigDecimal类来进行精确计算。BigDecimal类可以处理任意精度的十进制数,因此可以避免出现无限循环小数的情况。
以下是一个使用BigDecimal类解决此问题的示例代码:
```java
import java.math.BigDecimal;
public class Example {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("3");
BigDecimal result = a.divide(b, 10, BigDecimal.ROUND_HALF_UP);
System.out.println(result);
}
}
```
在上面的示例代码中,我们使用BigDecimal类来计算1除以3,结果保留10位小数,并使用四舍五入的方式进行舍入。这样就可以避免出现无限循环小数的情况。
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. ,怎么解决
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result是Java中的一个异常,表示在进行浮点数运算时出现了无法精确表示的十进制结果。这通常发生在除法运算中,当除数不能整除时,会产生无限小数。
要解决这个异常,可以考虑以下几种方法:
1. 检查除数是否为0:在进行除法运算之前,先检查除数是否为0,避免出现除以0的情况。
2. 使用BigDecimal类:使用BigDecimal类进行浮点数运算可以提供更高的精度和控制。可以使用BigDecimal的divide方法进行除法运算,并指定精确的小数位数和舍入规则。
3. 转换为整数运算:如果可以将浮点数转换为整数进行运算,可以避免出现无限小数的情况。例如,可以将浮点数乘以一个合适的倍数,转换为整数进行计算,然后再将结果转回浮点数。
4. 使用Math类的round方法:如果只需要对结果进行四舍五入,可以使用Math类的round方法对结果进行舍入操作。