From 51d5312005e6a5b98f0e91e8701ea563516bd634 Mon Sep 17 00:00:00 2001 From: vera-rubin <322284620+vera-rubin@users.noreply.github.com> Date: Wed, 14 Oct 2026 18:55:10 +0000 Subject: [PATCH] Fix significant-digit rounding after fractional carry --- babel/numbers.py | 3 +++ tests/test_numbers_format_decimal.py | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/babel/numbers.py b/babel/numbers.py index b782521e5..2e142b183 100644 --- a/babel/numbers.py +++ b/babel/numbers.py @@ -1587,6 +1587,9 @@ def _format_significant(self, value: decimal.Decimal, minimum: int, maximum: int exp = value.adjusted() scale = maximum - 1 - exp digits = str(value.scaleb(scale).quantize(decimal.Decimal(1))) + # Account for a carry that increases the number of digits. + if len(digits) > maximum: + exp += 1 if scale <= 0: result = digits + '0' * -scale else: diff --git a/tests/test_numbers_format_decimal.py b/tests/test_numbers_format_decimal.py index 98660a5ff..d06e0cea7 100644 --- a/tests/test_numbers_format_decimal.py +++ b/tests/test_numbers_format_decimal.py @@ -65,6 +65,16 @@ def test_significant_digits(): assert numbers.format_decimal(0.1, '@@', locale='en_US') == '0.10' +def test_significant_digits_fractional_carry(): + for value, expected in [ + ('0.00994', '0.0099'), + ('0.00999', '0.010'), + ('0.0999', '0.10'), + ('0.000999', '0.0010'), + ]: + assert numbers.format_decimal(decimal.Decimal(value), '@@', locale='en_US') == expected + + def test_decimals(): """Test significant digits patterns""" assert numbers.format_decimal(decimal.Decimal('1.2345'), '#.00', locale='en_US') == '1.23'