DigitList bug in recent patch
Frank Ding
dingxmin at linux.vnet.ibm.com
Wed Mar 27 07:50:32 UTC 2013
Current JDK gives the output of "78.0001".
Best regards,
Frank
On 3/27/2013 3:48 PM, Frank Ding wrote:
> Hi guys,
> We noticed there is a recent change (patch @
> http://hg.openjdk.java.net/jdk8/jdk8/jdk/rev/bc1f16f5566f ) that
> changed the behavior of the following program.
>
> import java.math.RoundingMode;
> public class TestNumberFormat {
>
> public static void main(String[] args) {
>
> java.text.NumberFormat numberFormat =
> java.text.NumberFormat.getInstance(
> java.util.Locale.US);
> double v = 78.00005;
> numberFormat.setMaximumFractionDigits(4);
> numberFormat.setRoundingMode(RoundingMode.HALF_EVEN);
> numberFormat.setMinimumFractionDigits(0);
> numberFormat.setGroupingUsed(false);
> String ret = numberFormat.format(v);
> System.out.println(ret);
> }
> }
>
> Note the rounding mode HALF_EVEN and the expected output should be
> "78" which can also be verified by running previous jdk (before b73).
>
> Stepping into code and the suspicious code is in
> DigitList.shouldRoundUp(). allDecimalDigits is false so true is
> returned, causing the last digit in fraction part to be 1.
> case HALF_EVEN:
> // Implement IEEE half-even rounding
> if (digits[maximumDigits] > '5') {
> return true;
> } else if (digits[maximumDigits] == '5' ) {
> if (maximumDigits == (count - 1)) {
> // the rounding position is exactly the last
> index :
> if (alreadyRounded)
> // If FloatingDecimal rounded up (value
> was below tie),
> // then we should not round up again.
> return false;
>
> if (!allDecimalDigits)
> // Otherwise if the digits dont represent
> exact value,
> // value was above tie and FloatingDecimal
> truncated
> // digits to tie. We must round up.
> return true;
>
> Since I am not familiar of the numeric conversion, can any one shed
> your light on it?
>
> Best regards,
> Frank
More information about the core-libs-dev
mailing list