Unexpected results comparing float to Fraction

Terry Reedy tjreedy at udel.edu
Mon Jul 29 13:08:20 EDT 2013


On 7/29/2013 11:50 AM, Ian Kelly wrote:
> On Mon, Jul 29, 2013 at 9:43 AM, Steven D'Aprano
> <steve+comp.lang.python at pearwood.info> wrote:
>> Comparing floats to Fractions gives unexpected results:
>>
>> # Python 3.3
>> py> from fractions import Fraction
>> py> 1/3 == Fraction(1, 3)
>> False
>>
>> but:
>>
>> py> 1/3 == float(Fraction(1, 3))
>> True
>>
>>
>> I expected that float-to-Fraction comparisons would convert the Fraction
>> to a float, but apparently they do the opposite: they convert the float
>> to a Fraction:
>>
>> py> Fraction(1/3)
>> Fraction(6004799503160661, 18014398509481984)
>>
>>
>> Am I the only one who is surprised by this? Is there a general rule for
>> which way numeric coercions should go when doing such comparisons?
>
> Any float can be precisely represented as a Fraction.  Not so in the
> other direction.

In other words, there can be multiple unequal Franctions that have the 
same float value: for instance, Fraction(1,3) and 
Fraction(6004799503160661, 18014398509481984)

 > So from that standpoint it makes sense to me to cast to
 > Fraction when comparing.

Otherwise, == becomes non-transitive

-- 
Terry Jan Reedy




More information about the Python-list mailing list