Author: fanningpj
Date: Fri Apr 29 12:25:29 2022
New Revision: 1900376

URL: http://svn.apache.org/viewvc?rev=1900376&view=rev
Log:
[bug-66047] change mround implementation due to issue - thanks to @fabio

Modified:
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/MRound.java
    poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/atp/TestMRound.java

Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/MRound.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/MRound.java?rev=1900376&r1=1900375&r2=1900376&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/MRound.java 
(original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/MRound.java Fri 
Apr 29 12:25:29 2022
@@ -22,6 +22,9 @@ import org.apache.poi.ss.formula.eval.*;
 import org.apache.poi.ss.formula.functions.FreeRefFunction;
 import org.apache.poi.ss.formula.functions.NumericFunction;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
 /**
  * Implementation of Excel 'Analysis ToolPak' function MROUND()<br>
  *
@@ -56,7 +59,10 @@ final class MRound implements FreeRefFun
                     // 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);

Modified: 
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/atp/TestMRound.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/atp/TestMRound.java?rev=1900376&r1=1900375&r2=1900376&view=diff
==============================================================================
--- poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/atp/TestMRound.java 
(original)
+++ poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/atp/TestMRound.java 
Fri Apr 29 12:25:29 2022
@@ -31,6 +31,7 @@ import org.junit.jupiter.api.Test;
  */
 class TestMRound {
 
+    //examples from 
https://support.microsoft.com/en-us/office/mround-function-c299c3b0-15a5-426d-aa4b-d2d5b3baf427
     /**
         =MROUND(10, 3)  Rounds 10 to a nearest multiple of 3 (9)
         =MROUND(-10, -3)    Rounds -10 to a nearest multiple of -3 (-9)
@@ -51,6 +52,8 @@ class TestMRound {
         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 +73,8 @@ class TestMRound {
 
         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)");
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to