On Fri, Mar 7, 2014 at 8:00 PM, Chris Angelico <rosuav@gmail.com> wrote:
On Sat, Mar 8, 2014 at 2:55 PM, Paul Du Bois <paul.dubois@gmail.com> wrote:
> On Fri, Mar 7, 2014 at 6:15 PM, Guido van Rossum <guido@python.org> wrote:
>>
>> Or, Decimal(repr(some_float)), which DWIM.

> Because I haven't seen anyone else bring this up, using a non-exact
> conversion breaks the invariant "Decimal(f)==f".
>
> There are so many pairs of numeric types that break that invariant that it
> might not be a big deal; but in all other cases the invariant is broken
> because it is theoretically impossible.
>
> from decimal import Decimal
> f = 2.2
> print(Decimal(f)==f)
> print(Decimal(repr(f))==f)

How is Decimal==float implemented? Is it by calling Decimal(rhs) and
then comparing? If so, changing how Decimal(float) works won't break
the invariant, as it'll make the same conversion each time.

There's a special function to convert the other operand for the purpose of comparisons, and it currently uses Decimal.from_float(). I am not (yet :-) proposing to change the behavior of that function -- it is and has always been the API function that does exact float-to-Decimal conversion. Decimal(repr(f)) == f returns False today (for the majority of float values anyway) and under my proposal Decimal(f) == f would also return False. I don't (yet :-) think that's a deal breaker.

--
--Guido van Rossum (python.org/~guido)