DigitList bug in recent patch
Brian Burkhalter
brian.burkhalter at oracle.com
Wed Mar 27 14:29:52 UTC 2013
Interesting. This week I was just running some regression tests against the updated patch for 7032154 (not yet posted) and the only failures I found were in the HALF_* cases in TieRoundingTest.
I'll check out what you reported while looking into it.
Thanks,
Brian
On Mar 27, 2013, at 12:50 AM, Frank Ding wrote:
> 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