Comparing float and decimal
Nick Craig-Wood
nick at craig-wood.com
Wed Sep 24 05:30:03 EDT 2008
Terry Reedy <tjreedy at udel.edu> wrote:
> The new fractions module acts differently, which is to say, as most
> would want.
>
> >>> from fractions import Fraction as F
> >>> F(1) == 1.0
> True
> >>> F(1.0)
> Traceback (most recent call last):
> File "<pyshell#20>", line 1, in <module>
> F(1.0)
> File "C:\Program Files\Python30\lib\fractions.py", line 97, in __new__
> numerator = operator.index(numerator)
> TypeError: 'float' object cannot be interpreted as an integer
Both the Fraction module and the Decimal module could represent floats
exactly and reversibly since floats are of the form
mantissa * 2**exponent
which is exactly representable as a fraction (rational) and also as
mantissa2 * 10**exponent2
as to why we don't do this...
I guess it is to preserve the sanity of the user when they write
fraction(0.1) or decimal(0.1) did they really mean fraction(1,10),
decimal("0.1") or the exact representations which are
decimal("0.1000000000000000055511151231257827021181583404541015625")
and fraction(3602879701896397,2**55)
Given that we let the exact representations leak out anyway (which
causes a lot of FAQs in this list), eg
>>> 0.1
0.10000000000000001
IMHO We should put the exact conversions in for floats to Decimal and
Fraction by default and add a new section to the FAQ!
In that way people will see floats for what they really are - a crude
approximation to a rational number ;-)
--
Nick Craig-Wood <nick at craig-wood.com> -- http://www.craig-wood.com/nick
More information about the Python-list
mailing list