Kaydet (Commit) 393f1ff6 authored tarafından Elias Zamaria's avatar Elias Zamaria Kaydeden (comit) Mark Dickinson

bpo-32968: Make modulo and floor division involving Fraction and float…

bpo-32968: Make modulo and floor division involving Fraction and float consistent with other operations (#5956)

Make mixed-type `%` and `//` operations involving `Fraction` and `float` objects behave like all other mixed-type arithmetic operations: first the `Fraction` object is converted to a `float`, then the `float` operation is performed as normal. This fixes some surprising corner cases, like `Fraction('1/3') % inf` giving a NaN.

Thanks Elias Zamaria for the patch.
üst 74734f73
...@@ -427,23 +427,18 @@ class Fraction(numbers.Rational): ...@@ -427,23 +427,18 @@ class Fraction(numbers.Rational):
__truediv__, __rtruediv__ = _operator_fallbacks(_div, operator.truediv) __truediv__, __rtruediv__ = _operator_fallbacks(_div, operator.truediv)
def __floordiv__(a, b): def _floordiv(a, b):
"""a // b""" """a // b"""
return math.floor(a / b) return math.floor(a / b)
def __rfloordiv__(b, a): __floordiv__, __rfloordiv__ = _operator_fallbacks(_floordiv, operator.floordiv)
"""a // b"""
return math.floor(a / b)
def __mod__(a, b): def _mod(a, b):
"""a % b""" """a % b"""
div = a // b div = a // b
return a - b * div return a - b * div
def __rmod__(b, a): __mod__, __rmod__ = _operator_fallbacks(_mod, operator.mod)
"""a % b"""
div = a // b
return a - b * div
def __pow__(a, b): def __pow__(a, b):
"""a ** b """a ** b
......
...@@ -401,15 +401,19 @@ class FractionTest(unittest.TestCase): ...@@ -401,15 +401,19 @@ class FractionTest(unittest.TestCase):
self.assertTypedEquals(10.0 + 0j, (1.0 + 0j) / F(1, 10)) self.assertTypedEquals(10.0 + 0j, (1.0 + 0j) / F(1, 10))
self.assertTypedEquals(0, F(1, 10) // 1) self.assertTypedEquals(0, F(1, 10) // 1)
self.assertTypedEquals(0, F(1, 10) // 1.0) self.assertTypedEquals(0.0, F(1, 10) // 1.0)
self.assertTypedEquals(10, 1 // F(1, 10)) self.assertTypedEquals(10, 1 // F(1, 10))
self.assertTypedEquals(10**23, 10**22 // F(1, 10)) self.assertTypedEquals(10**23, 10**22 // F(1, 10))
self.assertTypedEquals(10, 1.0 // F(1, 10)) self.assertTypedEquals(1.0 // 0.1, 1.0 // F(1, 10))
self.assertTypedEquals(F(1, 10), F(1, 10) % 1) self.assertTypedEquals(F(1, 10), F(1, 10) % 1)
self.assertTypedEquals(0.1, F(1, 10) % 1.0) self.assertTypedEquals(0.1, F(1, 10) % 1.0)
self.assertTypedEquals(F(0, 1), 1 % F(1, 10)) self.assertTypedEquals(F(0, 1), 1 % F(1, 10))
self.assertTypedEquals(0.0, 1.0 % F(1, 10)) self.assertTypedEquals(1.0 % 0.1, 1.0 % F(1, 10))
self.assertTypedEquals(0.1, F(1, 10) % float('inf'))
self.assertTypedEquals(float('-inf'), F(1, 10) % float('-inf'))
self.assertTypedEquals(float('inf'), F(-1, 10) % float('inf'))
self.assertTypedEquals(-0.1, F(-1, 10) % float('-inf'))
# No need for divmod since we don't override it. # No need for divmod since we don't override it.
......
...@@ -1814,6 +1814,7 @@ Masazumi Yoshikawa ...@@ -1814,6 +1814,7 @@ Masazumi Yoshikawa
Arnaud Ysmal Arnaud Ysmal
Bernard Yue Bernard Yue
Moshe Zadka Moshe Zadka
Elias Zamaria
Milan Zamazal Milan Zamazal
Artur Zaprzala Artur Zaprzala
Mike Zarnstorff Mike Zarnstorff
......
Modulo and floor division involving Fraction and float should return float.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment