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@python.org >http://mail.python.org/mailman/listinfo/tutor _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor