On Mon, 15 Dec 2025 23:30:06 GMT, Chen Liang <[email protected]> wrote:

>> Shaojin Wen has updated the pull request with a new target base due to a 
>> merge or a rebase. The pull request now contains 37 commits:
>> 
>>  - Merge remote-tracking branch 'upstream/master' into dec_to_str_202501
>>  - simplify layoutChars
>>  - comments, from @liach
>>  - getValueString -> getCompactValueString, from @liach
>>  - Refactor BigDecimal string creation to use 
>> JLA.uncheckedNewStringWithLatin1Bytes
>>    
>>    Co-authored-by: Qwen-Coder <[email protected]>
>>  - Merge remote-tracking branch 'upstream/master' into dec_to_str_202501
>>    
>>    # Conflicts:
>>    # src/java.base/share/classes/java/math/BigDecimal.java
>>  - Merge remote-tracking branch 'upstream/master' into dec_to_str_202501
>>    
>>    # Conflicts:
>>    # src/java.base/share/classes/java/math/BigDecimal.java
>>    # src/java.base/share/classes/jdk/internal/util/DecimalDigits.java
>>    # test/micro/org/openjdk/bench/java/math/BigDecimals.java
>>  - Merge remote-tracking branch 'upstream/master' into dec_to_str_202501
>>  - Merge remote-tracking branch 'upstream/master' into dec_to_str_202501
>>    
>>    # Conflicts:
>>    # src/java.base/share/classes/jdk/internal/util/DecimalDigits.java
>>  - remove getChars(long, int, char[])
>>  - ... and 27 more: https://git.openjdk.org/jdk/compare/3f33eaa4...32d95b36
>
> src/java.base/share/classes/java/math/BigDecimal.java line 4237:
> 
>> 4235:             if (coeffLen > 1) {          // more to come
>> 4236:                 buf.append('.')
>> 4237:                    .append(coeff, 1, coeffLen);
> 
> Is this right that the old end is `coeffLen - 1` but the new end is 
> `coeffLen`? I don't see why there should be no more `-1`.

If we use `new BigDecimal("4.933579065397471E-11").toString()` as an example:

In the original code, `coeff` is generated as follows, with three unused null 
values ​​before the `char[]`:


coeff = new char[19];
offset = DecimalDigits.getChars(Math.abs(intCompact), coeff.length, coeff);



The code that was called:

// coeff    := [, , , 4, 9, 3, 3, 5, 7, 9, 0, 6, 5, 3, 9, 7, 4, 7, 1]
// offset   := 3
// coeffLen := 16
// append(char[] str, int offset, int len)

buf.append(coeff, offset + 1, coeffLen - 1);



In the new code, coeff is generated as follows:


byte[] buf = new byte[coeffLen];
DecimalDigits.uncheckedGetCharsLatin1(intCompactAbs, buf.length, buf);
coeff = newStringNoRepl(buf);


The method call has also been changed from `append(char[] str, int offset, int 
len)` to `append(CharSequence s, int start, int end)`.

// coeff    := "4933579065397471"
// coeffLen := 16
// append(CharSequence s, int start, int end)

buf.append(coeff, 1, coeffLen);


|               |  origin                                                       
             |  current           |
|---------------|----------------------------------------------------------------------------|--------------------|
|  coeoff       |  [ 0x00, 0x00, 0x00, 4, 9, 3, 3, 5, 7, 9, 0, 6, 5, 3, 9, 7, 
4, 7, 1]  | "4933579065397471" |
|  offset       |  3                                                            
             |                    |
|  coeffLen     |  16                                                           
             |    16              |
|  call method  |  append(char[] str, int offset, int len)                      
             | append(CharSequence s, int start, int end) |

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/23310#discussion_r2633331853

Reply via email to