Bigdecimal做除法(divide)运算时报错:Non-terminating decimal expansion; no exact representable decimal result.

  • Post author:
  • Post category:其他



BigDecimal autoareameasure=work.getAutoareameasure();

//计算自动计算亩数和人工录入亩数相差范围值

BigDecimal areameasureZC=rgAreameasure.subtract(autoareameasure);

Double roundVal=Double.valueOf(String.valueOf(areameasureZC.divide(autoareameasure).setScale(2,BigDecimal.ROUND_HALF_UP)));


用Bigdecimal做除法运算时报错如下:


java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.


at java.math.BigDecimal.divide(BigDecimal.java:1616)

at com.hysoft.business.WorkOperationBusi.EndWorkOperation(WorkOperationBusi.java:178)

at com.hysoft.action.WorkOperationAction.EndWorkOperation(WorkOperationAction.java:52)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)

at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)

at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at com.hysoft.common.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:37)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)

at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)

at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

at java.lang.Thread.run(Thread.java:744)


Bigdecimal做除法运算时,不做精度处理,会出现小数无限循环的情况,就会抛出异常。


处理方式就是在做除法运算时设定小数精度,


BigDecimal areameasureZC=rgAreameasure.subtract(autoareameasure).setScale(2, BigDecimal.ROUND_HALF_UP);

Double roundVal=Double.valueOf(String.valueOf(areameasureZC.divide(autoareameasure,2,BigDecimal.ROUND_HALF_UP)));



版权声明:本文为cxws110原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。