--- old/src/java.base/share/classes/java/math/BigDecimal.java 2019-11-24 09:48:17.503122824 -0800 +++ new/src/java.base/share/classes/java/math/BigDecimal.java 2019-11-24 09:48:17.114928824 -0800 @@ -2204,6 +2204,39 @@ } } else { result = approx.scaleByPowerOfTen(-scaleAdjust/2).round(mc); + + switch (targetRm) { + case DOWN: + case FLOOR: + // Check if too big + if (result.multiply(result).compareTo(this) > 0 ) { + BigDecimal ulp = ulp = result.ulp(); + // Adjust increment down in case of 1.0 = 10^0 + // since the next smaller number is 1/10 + // closer than the next larger at exponent + // boundaries. + if (result.compareTo(ONE) == 0) { + ulp = ulp.multiply(ONE_TENTH); + } + result = result.subtract(ulp); + } + break; + + case UP: + case CEILING: + // Check if too small + if (result.multiply(result).compareTo(this) < 0 ) { + result = result.add(result.ulp()); + } + break; + + default: + // Do nothing for half-way cases + // HALF_DOWN, HALF_EVEN, HALF_UP + // See fix-up in paper, up down by *1/2* ulp + break; + } + } if (result.scale() != preferredScale) {