Rational numbers with float-like repr

class maelzel.rational.Rat[source]

Drop-in replacement to fractions.Fraction with float-like repr

A rational number used to avoid rounding errors.

A maelzel.rational.Rat is a drop-in replacement for fractions.Fraction with float-like repr. It can be used whenever a Fraction is used to avoid rounding errors, but its repr resembles that of a float

If the package quicktions is installed (a fast implementation of Fraction in cython), it is used as a base class of Rat. For that, to test if a Rat is Fraction-like, avoid using isinstance(x, Fraction) but use:

>>> from numbers import Rational
>>> from maelzel.rational import Rat
>>> x = Rat(1, 3)
>>> isinstance(x, Rational)
True

The same is valid when using type annotations:

import numbers
def square(a: numbers.Rational) -> numbers.Rational:
    return a*a

For all other aspects the documentation for python fractions.Fraction is valid for this implementation: https://docs.python.org/3/library/fractions.html

classmethod from_float(x)[source]

Converts a finite float to a rational number, exactly.

Beware that Fraction.from_float(0.3) != Fraction(3, 10).

Return type:

Rat

limit_denominator(max_denominator=1000000)[source]

Closest Fraction to self with denominator at most max_denominator.

Return type:

Rat

>>> Fraction('3.141592653589793').limit_denominator(10)
Fraction(22, 7)
>>> Fraction('3.141592653589793').limit_denominator(100)
Fraction(311, 99)
>>> Fraction(4321, 8765).limit_denominator(10000)
Fraction(4321, 8765)