--- src/java/org/apache/poi/ss/formula/functions/MathX.java (revision 1134872) +++ src/java/org/apache/poi/ss/formula/functions/MathX.java (working copy) @@ -53,13 +53,7 @@ retval = Double.NaN; } else { - if (p != 0) { - double temp = Math.pow(10, p); - retval = Math.round(n*temp)/temp; - } - else { - retval = Math.round(n); - } + retval = java.math.BigDecimal.valueOf(n).setScale(p, java.math.RoundingMode.HALF_UP).doubleValue(); } return retval; @@ -87,22 +81,7 @@ retval = Double.NaN; } else { - if (p != 0) { - double temp = Math.pow(10, p); - double nat = Math.abs(n*temp); - - retval = sign(n) * - ((nat == (long) nat) - ? nat / temp - : Math.round(nat + 0.5) / temp); - } - else { - double na = Math.abs(n); - retval = sign(n) * - ((na == (long) na) - ? na - : (long) na + 1); - } + retval = java.math.BigDecimal.valueOf(n).setScale(p, java.math.RoundingMode.UP).doubleValue(); } return retval; @@ -130,13 +109,7 @@ retval = Double.NaN; } else { - if (p != 0) { - double temp = Math.pow(10, p); - retval = sign(n) * Math.round((Math.abs(n)*temp) - 0.5)/temp; - } - else { - retval = (long) n; - } + retval = java.math.BigDecimal.valueOf(n).setScale(p, java.math.RoundingMode.DOWN).doubleValue(); } return retval; --- src/testcases/org/apache/poi/ss/formula/functions/TestMathX.java (revision 1134872) +++ src/testcases/org/apache/poi/ss/formula/functions/TestMathX.java (working copy) @@ -672,6 +672,9 @@ d = 150.0; p = -2; assertEquals("round ", 200, MathX.round(d, p)); + + d = 2162.615d; p = 2; + assertEquals("round ", 2162.62d, MathX.round(d, p)); } public void testRoundDown() {