When a precision cuts a hexfloat exactly in the middle fmt always rounds up, e.g. fmt::format("{:.1a}", 1.03125) gives 0x1.1p+0 while printf("%.1a") gives 0x1.0p+0. C says the result is rounded per the current rounding mode, so glibc and friends round ties to even, and this used to match before #3179 replaced the snprintf call.
The rounding only looked at the first dropped digit (v >= 8). Now a dropped 8 with nothing after it rounds up only when the last kept digit is odd, anything above half still rounds up as before.
Repro and test: added a few cases next to the other hexfloat checks in format-test, they fail on main. I also compared fmt::format and fmt::sprintf against glibc snprintf for 900k random doubles with random a/A/e/f/g specs (precision, width, flags) under ASan/UBSan. Before this the diffs were these hexfloat ties plus one case where glibc itself is off (%#.2G of 99.51 gives 1.E+02, fmt gives the correct 1.0E+02), after it only that one is left. format-test and printf-test pass, the rest of ctest is the same as main.