diff --git a/common/src/main/java/com/genexus/DecimalUtil.java b/common/src/main/java/com/genexus/DecimalUtil.java index f507ae3ea..def17b88a 100644 --- a/common/src/main/java/com/genexus/DecimalUtil.java +++ b/common/src/main/java/com/genexus/DecimalUtil.java @@ -61,15 +61,18 @@ public static java.math.BigDecimal doubleToDec(double d, int len, int dec) return new java.math.BigDecimal(CommonUtil.ltrim(CommonUtil.str(d, len, dec))); } + private static final int DOUBLE_SCALE = 18; // ~17 decimal digits of precision for double public static double decToDouble(java.math.BigDecimal decimal) { - return decimal.doubleValue(); + if(decimal.scale() >= DOUBLE_SCALE) + return decimal.setScale(DOUBLE_SCALE, BigDecimal.ROUND_HALF_DOWN).doubleValue(); + else return decimal.doubleValue(); } public static BigDecimal unexponentString(String num) { num = num.trim(); - + String exponent; int scaleAdj = 0; int epos = num.indexOf('E'); diff --git a/common/src/main/java/com/genexus/util/ExpressionEvaluator.java b/common/src/main/java/com/genexus/util/ExpressionEvaluator.java index de01f48bc..31cb56020 100644 --- a/common/src/main/java/com/genexus/util/ExpressionEvaluator.java +++ b/common/src/main/java/com/genexus/util/ExpressionEvaluator.java @@ -735,7 +735,7 @@ public static EvalValue multiply(EvalValue a, EvalValue b) public static EvalValue divide(EvalValue a, EvalValue b) { if (a.stringValue == null) - return new EvalValue(a.getDecimal().divide(b.getDecimal(), MathContext.DECIMAL64)); + return new EvalValue(a.getDecimal().divide(b.getDecimal(), MathContext.DECIMAL128)); else throw new IllegalArgumentException("Invalid operation: string / string"); }