Index: poi/src/main/java/org/apache/poi/ss/formula/atp/MRound.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/poi/src/main/java/org/apache/poi/ss/formula/atp/MRound.java b/poi/src/main/java/org/apache/poi/ss/formula/atp/MRound.java --- a/poi/src/main/java/org/apache/poi/ss/formula/atp/MRound.java (revision d280b7438854dd9aaa31d723559303358548946a) +++ b/poi/src/main/java/org/apache/poi/ss/formula/atp/MRound.java (date 1651231121300) @@ -17,6 +17,9 @@ package org.apache.poi.ss.formula.atp; +import java.math.BigDecimal; +import java.math.RoundingMode; + import org.apache.poi.ss.formula.OperationEvaluationContext; import org.apache.poi.ss.formula.eval.*; import org.apache.poi.ss.formula.functions.FreeRefFunction; @@ -56,7 +59,9 @@ // Returns #NUM! because the number and the multiple have different signs throw new EvaluationException(ErrorEval.NUM_ERROR); } - result = multiple * Math.round( number / multiple ); + BigDecimal bdMultiple = BigDecimal.valueOf(multiple); + result = bdMultiple.multiply(BigDecimal.valueOf(number).divide(bdMultiple, 0, RoundingMode.HALF_UP)) + .doubleValue(); } NumericFunction.checkValue(result); return new NumberEval(result); Index: poi/src/test/java/org/apache/poi/ss/formula/atp/TestMRound.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/poi/src/test/java/org/apache/poi/ss/formula/atp/TestMRound.java b/poi/src/test/java/org/apache/poi/ss/formula/atp/TestMRound.java --- a/poi/src/test/java/org/apache/poi/ss/formula/atp/TestMRound.java (revision d280b7438854dd9aaa31d723559303358548946a) +++ b/poi/src/test/java/org/apache/poi/ss/formula/atp/TestMRound.java (date 1651231006183) @@ -51,6 +51,8 @@ cell4.setCellFormula("MROUND(5, -2)"); Cell cell5 = sh.createRow(0).createCell(0); cell5.setCellFormula("MROUND(5, 0)"); + Cell cell6 = sh.createRow(0).createCell(0); + cell6.setCellFormula("MROUND(0.79*7.5, 0.05)"); double accuracy = 1E-9; @@ -70,5 +72,8 @@ assertEquals(0.0, evaluator.evaluate(cell5).getNumberValue(), 0, "Returns 0 because the multiple is 0"); + + assertEquals(5.95, evaluator.evaluate(cell6).getNumberValue(), 0, + "Rounds 5.925 to a nearest multiple of 0.05 (5.95)"); } }