On Thu, 17 Sep 2026 23:20:27 GMT, Justin Lu <[email protected]> wrote:
> This PR addresses a rounding error for > `CompactNumberFormat.format(BigDecimal)`, which occurs when the maximum > fraction digits value is greater than the minimum fraction digits value. > > For example, given a format with 0 minimum fraction digits and 2 maximum > fraction digits and a `BigDecimal` of 21_534_567.20, the following behavior > occurs. > > - `21_534_567.20` is first scaled to `21_534_567` to determine which compact > divisor should be used > - The millions pattern is selected, and the following division occurs -> > `21_534_567` / `1_000_000`. During the division operation, the minimum > fraction digits is inherited as the scale and applied to the resulting > quotient which produces 22. > > Instead, the division should occur exactly, and `21_534_567` / `1_000_000` > should produce `21.534567` which is then later rounded with the 2 maximum > fraction digits to a value of `"21.53M"`. > > While the filed regression points out the BD path, this also occurs for the > BI formatting path when the underlying value is greater than what a `long` > supports and whose division result would produce a fraction. > > --------- > - [x] I confirm that I make this contribution in accordance with the [OpenJDK > Interim AI Policy](https://openjdk.org/legal/ai). src/java.base/share/classes/java/text/CompactNumberFormat.java line 845: > 843: // Perform this division exactly, so that the quotient is > not inaccurately rounded. > 844: // For example, 22,550 / 1,000 should become 22.55 and not > 22. It is safe to perform exact > 845: // division because the divisor is a power of ten, thus the > result is always terminating. Since `.5` rounds toward the greater magnitude in common mathematical rounding (aka. round half away from zero), the example should probably be one which rounds the same in both common mathematical rounding and “round half to even” rounding (which is used by **IEEE 754**) Suggestion: // Perform this division exactly, so that the quotient is not inaccurately rounded. // For example, 21,550 / 1,000 should become 21.55 and not 22. It is safe to perform exact // division because the divisor is a power of ten, thus the result is always terminating. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/32933#discussion_r4045034512
