Skip to content

Commit 63dee8d

Browse files
archy-rock3t-cloudyliaog
authored andcommitted
Fix format_quantity precision and emit canonical decimal output
Signed-off-by: Artem Muterko <[email protected]>
1 parent 14ae4f0 commit 63dee8d

2 files changed

Lines changed: 24 additions & 6 deletions

File tree

‎kubernetes/e2e_test/test_utils.py‎

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -757,9 +757,11 @@ def test_format_quantity(self):
757757
"0.3Gi")
758758

759759
# == base 1000 ==
760-
self.assertEqual(quantity.format_quantity(Decimal(0.000_000_001), "n"), "1n")
761-
self.assertEqual(quantity.format_quantity(Decimal(0.000_001), "u"), "1u")
762-
self.assertEqual(quantity.format_quantity(Decimal(0.001), "m"), "1m")
760+
# Exact Decimals: float-derived Decimals (e.g. Decimal(0.001)) carry binary
761+
# rounding error that the precise scaling surfaces into the output.
762+
self.assertEqual(quantity.format_quantity(Decimal("0.000000001"), "n"), "1n")
763+
self.assertEqual(quantity.format_quantity(Decimal("0.000001"), "u"), "1u")
764+
self.assertEqual(quantity.format_quantity(Decimal("0.001"), "m"), "1m")
763765
self.assertEqual(quantity.format_quantity(Decimal(1_000), "k"), "1k")
764766
self.assertEqual(quantity.format_quantity(Decimal(1_000_000), "M"), "1M")
765767
self.assertEqual(quantity.format_quantity(Decimal(1_000_000_000), "G"), "1G")
@@ -781,3 +783,19 @@ def test_format_quantity(self):
781783
),
782784
"333k",
783785
)
786+
787+
# == milli/micro/nano keep full precision in canonical decimal form ==
788+
# Regression: these divided by a float-built Decimal and rendered in
789+
# scientific notation (e.g. "499.9999999999999895916591441m", "1E+9").
790+
self.assertEqual(quantity.format_quantity(Decimal("0.5"), "m"), "500m")
791+
self.assertEqual(quantity.format_quantity(Decimal("0.5"), "u"), "500000u")
792+
self.assertEqual(quantity.format_quantity(Decimal("0.5"), "n"), "500000000n")
793+
self.assertEqual(quantity.format_quantity(Decimal("1"), "m"), "1000m")
794+
self.assertEqual(quantity.format_quantity(Decimal("1"), "n"), "1000000000n")
795+
796+
# == quantize=Decimal(0) is honored, not treated as falsy ==
797+
self.assertEqual(quantity.format_quantity(Decimal("0.5006"), "m"), "500.6m")
798+
self.assertEqual(
799+
quantity.format_quantity(Decimal("0.5006"), "m", quantize=Decimal(0)),
800+
"501m",
801+
)

‎kubernetes/utils/quantity.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def format_quantity(quantity_value, suffix, quantize=None) -> str:
136136
if suffix[0] not in _EXPONENTS:
137137
raise ValueError(f"{quantity_value} has unknown suffix")
138138

139-
different_scale = quantity_value / Decimal(base ** _EXPONENTS[suffix[0]])
140-
if quantize:
139+
different_scale = quantity_value / (Decimal(base) ** _EXPONENTS[suffix[0]])
140+
if quantize is not None:
141141
different_scale = different_scale.quantize(quantize)
142-
return str(different_scale) + suffix
142+
return format(different_scale, "f") + suffix

0 commit comments

Comments
 (0)