aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/java/org/apache/poi/ss/formula/functions/NumericFunction.java4
-rw-r--r--src/testcases/org/apache/poi/ss/formula/functions/TestTrunc.java15
2 files changed, 16 insertions, 3 deletions
diff --git a/src/java/org/apache/poi/ss/formula/functions/NumericFunction.java b/src/java/org/apache/poi/ss/formula/functions/NumericFunction.java
index 1927848555..87646295bd 100644
--- a/src/java/org/apache/poi/ss/formula/functions/NumericFunction.java
+++ b/src/java/org/apache/poi/ss/formula/functions/NumericFunction.java
@@ -330,9 +330,7 @@ public abstract class NumericFunction implements Function {
try {
double d0 = singleOperandEvaluate(arg0, srcRowIndex, srcColumnIndex);
double d1 = singleOperandEvaluate(arg1, srcRowIndex, srcColumnIndex);
- double multi = Math.pow(10d,d1);
- if(d0 < 0) result = -Math.floor(-d0 * multi) / multi;
- else result = Math.floor(d0 * multi) / multi;
+ result = MathX.roundDown(d0, (int)d1);
checkValue(result);
}catch (EvaluationException e) {
return e.getErrorEval();
diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestTrunc.java b/src/testcases/org/apache/poi/ss/formula/functions/TestTrunc.java
index a501435616..c8f4d90f5f 100644
--- a/src/testcases/org/apache/poi/ss/formula/functions/TestTrunc.java
+++ b/src/testcases/org/apache/poi/ss/formula/functions/TestTrunc.java
@@ -58,6 +58,21 @@ public final class TestTrunc extends BaseTestNumeric {
}
@Test
+ public void testTruncWithProblematicDecimalNumber() {
+ ValueEval[] args = { new NumberEval(0.29), new NumberEval(2) };
+ ValueEval result = NumericFunction.TRUNC.evaluate(args, -1, (short)-1);
+ assertEquals("TRUNC", (new NumberEval(0.29d)).getNumberValue(), ((NumberEval)result).getNumberValue());
+ }
+
+ @Test
+ public void testTruncWithProblematicCalculationResult() {
+
+ ValueEval[] args = { new NumberEval(21.624d / 24d + .009d), new NumberEval(2) };
+ ValueEval result = NumericFunction.TRUNC.evaluate(args, -1, (short)-1);
+ assertEquals("TRUNC", (new NumberEval(0.91d)).getNumberValue(), ((NumberEval)result).getNumberValue());
+ }
+
+ @Test
public void testTruncWithDecimalNumberOneArg() {
ValueEval[] args = { new NumberEval(2.612777) };
ValueEval result = NumericFunction.TRUNC.evaluate(args, -1, (short)-1);