[Tutor] How to convert a long decimal into a string?
Dick Moores
rdm at rcblue.com
Tue Jan 16 21:28:26 CET 2007
At 12:16 PM 1/16/2007, Kent Johnson wrote:
>Dick Moores wrote:
> > Here's a function I wrote some time ago, and just discovered that in
> > one important category of cases, long numbers with a decimal point,
> > it doesn't do what I intended.
> >
> > =====================================================
> > def numberRounding(n, significantDigits=4):
> > """
> > Rounds a number (float or integer, negative or positive) to
> any number of
> > significant digits. If an integer, there is no limitation
> on it's size.
> > """
> > import decimal
> > def d(x):
> > return decimal.Decimal(str(x))
> > decimal.getcontext().prec = significantDigits
> > return d(n)/1
> > ======================================================
> >
> > Now, print
> > numberRounding(232.3452345230987987098709879087098709870987098745234,
> > 30) prints
> > 232.345234523
>
>The problem is that
>232.3452345230987987098709879087098709870987098745234 is a float which
>cannot represent this number exactly. Just typing it at the interpreter
>prompt shows the problem:
> >>> 232.3452345230987987098709879087098709870987098745234
>232.34523452309881
> >>> str(_)
>'232.345234523'
>
>So the precision you want is lost immediately when the constant is created.
> >
> > whereas if the first argument is enclosed in quotes, it does what I
> > indended. Thus:
> > print
> > numberRounding('232.3452345230987987098709879087098709870987098745234',
> > 30) prints
> > 232.345234523098798709870987909 .
> >
> > So my question is, how can I revise numberRounding() so that it is
> > not necessary to employ the quotes.
>
>You can't. A float simply can't represent the number you want and the
>function has no way to access the textual representation of the number.
>
> > Or alternatively, is there a way
> > to non-manually put quotes around an argument that is a long decimal?
>No
Thanks, Kent. So I go with working up "an algorithm for first
converting n to an int (for
example, multiplying the above n by 1000), converting to a string,
putting the decimal point back in between indices 2 and 3, then using
that string as n (thereby avoiding the use of quotes around n as the
first argument)."
Dick
>Kent
>
>_______________________________________________
>Tutor maillist - Tutor at python.org
>http://mail.python.org/mailman/listinfo/tutor
More information about the Tutor
mailing list