Skip to content

Commit b8ada6a

Browse files
authored
Fix BigDecimal precision when converting to double and integer. (#608)
Issue 98013
1 parent 5c120c1 commit b8ada6a

File tree

2 files changed

+6
-3
lines changed

2 files changed

+6
-3
lines changed

common/src/main/java/com/genexus/DecimalUtil.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,18 @@ public static java.math.BigDecimal doubleToDec(double d, int len, int dec)
6161
return new java.math.BigDecimal(CommonUtil.ltrim(CommonUtil.str(d, len, dec)));
6262
}
6363

64+
private static final int DOUBLE_SCALE = 18; // ~17 decimal digits of precision for double
6465
public static double decToDouble(java.math.BigDecimal decimal)
6566
{
66-
return decimal.doubleValue();
67+
if(decimal.scale() >= DOUBLE_SCALE)
68+
return decimal.setScale(DOUBLE_SCALE, BigDecimal.ROUND_HALF_DOWN).doubleValue();
69+
else return decimal.doubleValue();
6770
}
6871

6972
public static BigDecimal unexponentString(String num)
7073
{
7174
num = num.trim();
72-
75+
7376
String exponent;
7477
int scaleAdj = 0;
7578
int epos = num.indexOf('E');

common/src/main/java/com/genexus/util/ExpressionEvaluator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ public static EvalValue multiply(EvalValue a, EvalValue b)
735735
public static EvalValue divide(EvalValue a, EvalValue b)
736736
{
737737
if (a.stringValue == null)
738-
return new EvalValue(a.getDecimal().divide(b.getDecimal(), MathContext.DECIMAL64));
738+
return new EvalValue(a.getDecimal().divide(b.getDecimal(), MathContext.DECIMAL128));
739739
else
740740
throw new IllegalArgumentException("Invalid operation: string / string");
741741
}

0 commit comments

Comments
 (0)