2

使用 HARDSOFTBIGDECIMAL 分数。

在配置文件中,我将 scoreAttained 设置为 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 和覆盖 calculateTimeGradient(..) 方法解决了这个问题。在这里,当 BigDecimal 上的 divide 方法被调用时,我四舍五入。

4

1 回答 1

1

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

例如:1/3 = 0.33333...

文档

当为 MathContext 对象提供精度设置为 0(例如,MathContext.UNLIMITED)时,算术运算是精确的,就像不采用 MathContext 对象的算术方法一样。(这是 5 之前的版本中唯一支持的行为。)

作为计算精确结果的必然结果,不使用精度设置为 0 的 MathContext 对象的舍入模式设置,因此不相关。在除法的情况下,精确商可以有一个无限长的小数展开;例如,1 除以 3。

如果商具有非终止十进制扩展并且指定操作返回精确结果,则会引发 ArithmeticException。否则,将返回除法的确切结果,就像其他操作一样。

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

x.divide(y, 2, RoundingMode.HALF_UP)

哪里2是精度,RoundingMode.HALF_UP是舍入模式。

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

于 2014-02-25T23:30:41.103 回答