[Tutor] Rounding to n significant digits? (original) (raw)

Gregor Lingl glingl at aon.at
Sun Jul 4 06:44:05 EDT 2004


Tim Peters schrieb:

Then it's time to learn about one of the more obscure features of string formats: if you put an asterisk in a string format where a precision specifier is expected, the actual precision to use will be taken from the argument tuple. O.k. I took the opportunity to do so.

I realize that's confusing; that's why I called it obscure . It should be clearer from this rewrite of your rewrite of my original roundton function:

def roundton(x, n): if n < 1:_ _raise ValueError("number of significant digits must be >= 1") return "%.*e" % (n-1, x) That's probably the end of the line for this problem . Since long I appreciate very much the beauty and elegance of Tim's solutions, even to quasi "every day problems". (Yes, I know, 20+ years of experience ... ;-) )

A related but harder problem is to get a string rounded to n significant digits, but where the exponent is constrained to be a multiple of 3. This is often useful in engineering work. For example, in computer work, 1e6 and 1e3 are natural units (mega and kilo), but 1e4 isn't -- if I have 15,000 of something, I want to see that as 15e3, not as 1.5e4. I don't know an easy way to get that in Python (or in most other programming languages).

I suppose if Tim says this, there is no easy way. However, the result of my tinkering around with string formats (see remark above - and assuming that using regular expressions is not 'easy' (at least for me) - ) is:

def eng_round_to_n(x,n): man,exp = round_to_n(x, n).split("e") # contains error-handling sh=int(exp)%3 return "%.*fe%+04i" % (n-1-sh,float(man)*10**sh,int(exp)-sh)

  1. is it correct?
  2. doesn't it call for a pinch of elegance and streamlining?

Regards, Gregor



More information about the Tutor mailing list