DrDean
DrDean

Reputation: 117

How do I suppress scientific notation while controlling significant figures in Python?

I'm trying to print numbers that range across 8 orders of magnitude. I would like to print them with a fixed number of sig figs but not in scientific notation.

Toy program:

n = 123456.0
while n > 0.01:
    print(<format statement>)
    n = n/10

Desired output of this program:

120000
12000
1200
120
12
1.2
0.12
0.012

I've found a couple solutions that aren't quite right.

Option 1) f'{n:.2f'} gives output:

123456.00
12345.60
1234.56
123.46
12.35
1.23
0.12
0.01

It's not in scientific notation, but number of sig figs is all wrong.

Option 2) f'{n:.2'} gives output:

1.2e+05
1.2e+04
1.2e+03
1.2e+02
1.2e+01
1.2
0.12
0.012

Sig figs are correct, but large numbers get printed in scientific notation, rather than padding zeros. My numbers aren't big enough for scientific notation, so readability suffers. I could hack a method to do this, but I'm hoping there's a magic format string to do this for me. Thanks

Upvotes: 2

Views: 632

Answers (2)

DrDean
DrDean

Reputation: 117

I did end up writing a method for this, for anyone for whom sigfig is unavailable

def num_fmt(n: float, sf: int = 3) -> str:
    """
    Returns number as a formatted string with specified number of significant figures
    :param n: number to format
    :param sf: number of sig figs in output
    """
    r = f'{n:.{sf}}'  # use existing formatter to get to right number of sig figs
    if 'e' in r:
        # for big numbers, strip scientific notation and pad with zeros
        exp = int(r[-2:])
        r = r[0]+r[2:-4] + '0' * (exp-sf+2)
    return r

Upvotes: 1

ObjectJosh
ObjectJosh

Reputation: 641

The simplest solution is first pip installing sigfig. Then you can use this code:

from sigfig import round
n = 123456.0
while n > 0.01:
    # rounds to two significant figures
    print(round(n, sigfigs=2))
    n = n/10

Upvotes: 3

Related Questions