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]