subtract Exception in thread "main" java.lang.ArithmeticException: Rounding necessary
时间: 2023-11-08 17:01:50 浏览: 164
引用是关于Java中BigDecimal类的舍入模式。其中提到了RoundingMode取值范围为0到7,否则会抛出IllegalArgumentException异常。引用中的异常信息是在进行BigDecimal的setScale操作时抛出的ArithmeticException异常,异常信息中提示需要进行舍入操作。引用提供了关于BigDecimal的一些常用方法和舍入模式的详细解释。
关于您的问题,"subtract Exception in thread "main" java.lang.ArithmeticException: Rounding necessary"这个异常信息通常是由于在进行减法运算时,结果需要进行舍入操作而没有指定舍入模式所导致的。您可以通过设置舍入模式来解决这个问题。
相关问题
要怎么改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 + "%"); } }
这个错误是由于在执行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位小数。
阅读全文