On Fri, 16 Apr 2021 16:08:53 GMT, Ian Graves <igra...@openjdk.org> wrote:
>> This fixes a bug where the formatting code for `%g` flags incorrectly tries >> to round `BigDecimal` after determining whether it should be a decimal >> numeric format or a scientific numeric format. The solution rounds before >> determining the correct format. > > Ian Graves has updated the pull request incrementally with one additional > commit since the last revision: > > Inlining some single use variables src/java.base/share/classes/java/util/Formatter.java line 3827: > 3825: if ((value.equals(BigDecimal.ZERO)) > 3826: || ((value.compareTo(BigDecimal.valueOf(1, 4)) != > -1) > 3827: && (value.compareTo(BigDecimal.valueOf(1, > -prec)) == -1))) { Note that `compareTo` in general specifies a negative, zero, or positive return value, but BigDecimal and BigInteger specify a return value of -1, 0, and 1. So the code here that compares against -1 is strictly correct. However, the BigDecimal/BigInteger.compareTo docs say "The suggested idiom..." is a relative comparison against zero. Indeed, the BigDecimal::compareTo method does always seem to return -1, 0, or 1 so this code is not incorrect. Well, maybe. I checked quickly and the BigDecimal comparison logic is fairly intricate (and also runs through BigInteger) so I might have missed something. Also, BigDecimal is subclassable, so an override of `compareTo` might return something other than -1, 0, or 1, even though strictly speaking this would violate the BigDecimal spec. I'm wondering if there should be a followup bug that changes these tests to `>= 0` and `< 0`. ------------- PR: https://git.openjdk.java.net/jdk/pull/3363