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

Kent

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to