On Wed, 24 May 2023 18:47:45 GMT, Joe Darcy <da...@openjdk.org> wrote:

>>> I just wonder if it is ok to reverse the rounding/truncation only in this 
>>> special case. If the truncation always comes first, then 0.00 would be 
>>> correct (then 1.01 may be something wrong). Looks to me that the original 
>>> comment suggests it tries to truncate those cases. I suggest filing a CSR 
>>> for further behavioral consideration.
>> 
>> The normal behavior of DecimalFormat (DigitList) "rounds" before truncation. 
>> For example, consider
>> 
>> `1.0000009` formatted to `0.0` with `RoundingMode.UP`
>> 
>> DigitList will search past the maximum digits allowed to decide if the 
>> formatted value should be rounded. '9' will be found, and as such the value 
>> will be "rounded", by incrementing the value by 1 at the max digit location 
>> -> `1.1000009`, then DigitList will truncate -> `1.1`
>> 
>> Thus I believe that this change is aligning this special case to be 
>> consistent with the existing behavior of rounding before truncation. I will 
>> follow-up in the CSR.
>
>> > I just wonder if it is ok to reverse the rounding/truncation only in this 
>> > special case. If the truncation always comes first, then 0.00 would be 
>> > correct (then 1.01 may be something wrong). Looks to me that the original 
>> > comment suggests it tries to truncate those cases. I suggest filing a CSR 
>> > for further behavioral consideration.
>> 
>> The normal behavior of DecimalFormat (DigitList) "rounds" before truncation. 
>> For example, consider
>> 
>> `1.0000009` formatted to `0.0` with `RoundingMode.UP`
>> 
>> DigitList will search past the maximum digits allowed to decide if the 
>> formatted value should be rounded. '9' will be found, and as such the value 
>> will be "rounded", by incrementing the value by 1 at the max digit location 
>> -> `1.1000009`, then DigitList will truncate -> `1.1`
>> 
>> Thus I believe that this change is aligning this special case to be 
>> consistent with the existing behavior of rounding before truncation. I will 
>> follow-up in the CSR.
> 
> A quick comment without diving into the particular issues here, for each 
> finite floating-point value, there is a range of the real number line that 
> will round to that floating-point value. Under the default rounding policy, 
> some of those real numbers will be less than the floating-point value and 
> other of those real numbers will be greater than the floating-point value.
> 
> So there are decimal strings corresponding to those numbers greater than and 
> less than the floating-point value, all of which will get rounded to the same 
> double value on string conversion.
> 
> If the operation is phrased in terms of *the floating-point value* and not 
> *the real number value of what happened to be the input string*, then the 
> actual real value of the floating-point number should be the reference point 
> for rounding up/down on double -> String conversion.
> 
> This may give "surprising" results, but is numerically better. Without 
> finding the bug ids, some previous changes were made to decimal format when 
> rounding to nearest along those lines. HTH

Hi @jddarcy , are you referring to the cases like 
this:https://bugs.openjdk.org/browse/JDK-8062756 ? I understand the binary 
representation of real number could be below the real number, then the rounding 
may look strange, but in this particular case, I believe it won't affect the 
result, as the fix is to the following specific condition (excerpt of the 
comment there):

                // Handle an underflow to zero when we round something like
                // 0.0009 to 2 fractional digits.

So even if the number `0.0001` is represented by `0.00009999999something` it 
should round up to `0.01`.

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

PR Comment: https://git.openjdk.org/jdk/pull/14110#issuecomment-1562021619

Reply via email to