[Tutor] My function correct_num()

Goran Ikac goranikac65 at gmail.com
Thu Mar 30 08:58:12 EDT 2023


Hi, I wish a nice day to every pythonist out there!
I'm a newbie, still learning the basics. For an exercise, I wrote a
function *correct_num() *to avoid ridiculous presentation of some numeric
calculations in Python (e.g. *print(.1 + .1 + .1) *outputs
*0.30000000000000004*):

# written by ike 2023

def correct_num(num: float) -> float:
    """
    The function takes any number as the only argument.
    If the number is an integer, or if it is a float with up to *six *
decimal
    digits, the function returns the same number.
    If the number is a float with more than *six *decimal digits,
    the function returns that number with up to one digit less precision.
    That way, it corrects the errors made by the computer's numerical
    calculations.

    >>> .1 + .1 + .1
    0.30000000000000004
    >>> correct_num(.1 + .1 + .1)
    0.3
    >>> 24.95 - 9.98
    14.969999999999999
    >>> correct_num(24.95 - 9.98)
    14.97
    >>> correct_num(123)
    123
    >>> correct_num(123.0)
    123.0
    >>> correct_num(-123.0)
    -123.0
    >>> correct_num(0.123456)
    0.123456
    >>> correct_num(0.1234567)
    0.123457
    >>> correct_num(0.123456789)
    0.12345679
    >>> correct_num(-0.123456789)
    -0.12345679
    >>> correct_num(5.12345678e-5)
    5.1e-05
    >>> correct_num(5.17345678e-5)
    5.2e-05
    >>> correct_num(5.173e-6)
    5e-06
    >>> correct_num(5.173e-7)
    1e-06
    >>> >>> correct_num(5.173e-8)
    0.0

    """

    if num == int(num):             # If the number is an integer,
        return num                      # return the same number.

    numstr = str(num)

    if 'e' in numstr:               # If num is written in scientific
notation
        numstr = '{:.*7*f}'.format(num)

    # print('numstring ==', numstr)     # This is a control line.

    if '.' in numstr:               # If the numstr represents a float,
        # determine the number of num's decimal digits
        dec_digits = len(numstr[(numstr.index('.') + 1):])
        # If the limitation in how computers do arithmetic doesn't affect
num:
        if dec_digits < *7*:
            return num                  # return the same number.

    return round(num, dec_digits - 1)


Now, I'm happy with the function's work, but I don't know what number of
decimal digits to leave alone, e.g. what number of decimal digits are
certainly OK). I've decided it to be *six *decimal digits:
        if dec_digits < *7*:
            return num                  # return the same number.
but it was by pure intuition. Does anybody know what is the right number of
decimal digits to leave as they were returned by Python numeric
calculations?
And, of course, I'd be thankful for any comment about my code.
Also, can anybody, please, correct my English in the docstring?
Watch out! I'm riding to catch up with you, big boys and girls.


More information about the Tutor mailing list