in src/main/java/org/apache/commons/jexl3/parser/NumberParser.java [147:193]
NumberParser assignReal(final boolean negative, final String s) {
Number result;
Class<? extends Number> rclass;
if ("#NaN".equals(s) || "NaN".equals(s)) {
result = Double.NaN;
rclass = Double.class;
} else {
final int last = s.length() - 1;
switch (s.charAt(last)) {
case 'b':
case 'B': {
rclass = BigDecimal.class;
final BigDecimal bd = new BigDecimal(s.substring(0, last));
result = negative? bd.negate() : bd;
break;
}
case 'f':
case 'F': {
rclass = Float.class;
final float f4 = Float.parseFloat(s.substring(0, last));
result = negative? -f4 : f4;
break;
}
case 'd':
case 'D':
rclass = Double.class;
final double f8 = Double.parseDouble(s.substring(0, last));
result = negative? -f8 : f8;
break;
default: {
// preferred literal class is double
rclass = Double.class;
try {
final double d = Double.parseDouble(s);
result = negative? -d : d;
} catch (final NumberFormatException take3) {
final BigDecimal bd = new BigDecimal(s);
result = negative? bd.negate() : bd;
}
break;
}
}
}
literal = result;
clazz = rclass;
return this;
}