Exception Score条件引发算术异常-OptaPlanner

Exception Score条件引发算术异常-OptaPlanner,exception,math,optaplanner,Exception,Math,Optaplanner,使用硬软件BigDecimal分数 在配置文件中,我将score设置为0hard/0soft 我得到这个错误: Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source) at org.optaplan

使用硬软件BigDecimal分数

在配置文件中,我将score设置为0hard/0soft

我得到这个错误:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(Unknown Source)
at org.optaplanner.core.impl.score.buildin.hardsoftbigdecimal.HardSoftBigDecimalScoreDefinition.calculateTimeGradient(HardSoftBigDecimalScoreDefinition.java:96)
at org.optaplanner.core.impl.score.buildin.hardsoftbigdecimal.HardSoftBigDecimalScoreDefinition.calculateTimeGradient(HardSoftBigDecimalScoreDefinition.java:27)
at org.optaplanner.core.impl.termination.ScoreAttainedTermination.calculateSolverTimeGradient(ScoreAttainedTermination.java:50)
at org.optaplanner.core.impl.termination.OrCompositeTermination.calculateSolverTimeGradient(OrCompositeTermination.java:69)
at org.optaplanner.core.impl.termination.OrCompositeTermination.calculateSolverTimeGradient(OrCompositeTermination.java:69)
at org.optaplanner.core.impl.termination.PhaseToSolverTerminationBridge.calculatePhaseTimeGradient(PhaseToSolverTerminationBridge.java:80)
at org.optaplanner.core.impl.localsearch.DefaultLocalSearchSolverPhase.solve(DefaultLocalSearchSolverPhase.java:60)
at org.optaplanner.core.impl.solver.DefaultSolver.runSolverPhases(DefaultSolver.java:190)
at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:155)
编辑:


通过扩展HARDSOFTBIGDECIMALSCOREDEFINITION和重写CalculateMagradient(..)方法解决了此问题。在这里,当对BigDecimal调用divide方法时,我向上取整

您很可能将两个具有无穷精确商的数字相除

例如:
1/3=0.33333…

从:

当MathContext对象的精度设置为0时 (例如,MathContext.UNLIMITED),算术运算是精确的, 以及不接受MathContext对象的算术方法。(本 是5之前版本中支持的唯一行为。)

作为计算精确结果的推论,舍入模式 不允许设置精度设置为0的MathContext对象 使用过,因此不相关。在除法的情况下,精确的商 可以有一个无限长的十进制扩展;例如,1 除以3

如果商具有非终止十进制扩展,则 指定操作以返回准确的结果 引发算术异常。否则,计算的精确结果 与其他操作一样,返回除法

因此,要解决此问题,您需要为
BigDecimal
提供精度刻度,如下所示:

x.divide(y,2,取整模式。半向上)

其中
2
为精度,
RoundingMode。HALF_UP
为舍入模式


您可以阅读有关舍入的更多信息。

您能发布您的电话吗?@drowness@AliShah请求修复它欢迎:)回答得很好。作为一个图书馆,我们应该使用哪种取舍模式?我是欧洲人,所以我想是半途而废,但我们的美国用户/开发者甚至会更喜欢半途而废,而其他地区的其他用户/开发者可能会想要其他东西。。。另一方面,我非常不喜欢在这种计算中依赖于语言环境。@GeoffreyDeSmet-我在美国,我用了一半,但我想这取决于你的情况。我能看出你的困境,但我很难说是这样还是那样。很抱歉