diff --git a/langlib/lang.float/src/main/java/org/ballerinalang/langlib/floatingpoint/Round.java b/langlib/lang.float/src/main/java/org/ballerinalang/langlib/floatingpoint/Round.java index f4b287f8c583..5d4a3ecf4c6b 100644 --- a/langlib/lang.float/src/main/java/org/ballerinalang/langlib/floatingpoint/Round.java +++ b/langlib/lang.float/src/main/java/org/ballerinalang/langlib/floatingpoint/Round.java @@ -53,21 +53,14 @@ public static double round(double x, long fractionDigits) { // Down cast can be done safely because of above condition. int fractionDigitsAsInt = (int) fractionDigits; BigDecimal xInBigDecimal = BigDecimal.valueOf(x); - BigDecimal xTmp = xInBigDecimal; - int digitsTmp = fractionDigitsAsInt; - if (digitsTmp > 0) { - while (digitsTmp-- > 0) { - if (xTmp.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO) == 0) { - return x; - } - xTmp = xTmp.multiply(BigDecimal.TEN); + int scale = xInBigDecimal.scale(); + if (fractionDigitsAsInt > 0) { + if (fractionDigitsAsInt > scale) { + return x; } } else { - while (digitsTmp++ < 0) { - if (xTmp.compareTo(BigDecimal.ZERO) == 0) { - return 0; - } - xTmp = xTmp.divide(BigDecimal.TEN, 0, RoundingMode.DOWN); + if (-fractionDigitsAsInt > (xInBigDecimal.precision() - scale)) { + return 0; } } return xInBigDecimal.setScale(fractionDigitsAsInt, RoundingMode.HALF_EVEN).doubleValue();