整数次幂可变的两位数精度

时间:2018-11-19 14:37:38

标签: python rounding

我想要一个变量代码,例如将0.91823舍入为0.92,但是数字0.00009384应该舍入为0.000094。我想这很容易,但是我找不到能胜任的工作。

3 个答案:

答案 0 :(得分:2)

为清楚起见,我将使代码保持扩展状态,而不是将其强制成为单一代码。

def round2(n, numberOfDigits):
    p = floor(log10(n));

    # normalize
    n = n * pow(10, -p);

    # round
    n = (n - n % pow(10, numberOfDigits)) * pow(10, p);

    # return
   return n;

这个想法是首先通过将输入数字乘以适当的10的幂来“删除”所有前导零。 然后使用普通的舍入运算符将新数字舍入到适当的基数。 最后重新缩放数字。

答案 1 :(得分:1)

您可以将数字打印为2位数的精度,然后通过指定所需的小数位数转换为浮点数:

# Format the number to scientific notation with one digit before
# the decimal point and one after, then split the sctring into the mantissa
# and exponent.
a, b = ('{0:.1E}'.format(.0000004565)).split("E")

# If the exponent is -n, get the number of required decimal digits as n+1.
c=1-int(b)

# Set up a '%0.xf' format string where x is the required number of digits,
# and use that format to print the reassembled scientific notation value
res = ('%%0.%df' % c) % float(a+"E"+b)

这适用于某些数字> 1,但会分解为99以上的数字。

答案 2 :(得分:0)

您可以尝试字符串操作:

import re

def roundToDigit(number, numDigits):

    # Convert number to a string
    asStr = str(number)

    # Search for the first numerical digit, ignoring zeros
    m = re.search("[123456789]", asStr)
    if (not m):
        return round(0, numDigits)
    afterDecimal = m.start()

    # Check if the number is in scientific notation
    isExp = asStr.find("e") > -1
    if (isExp):
       numZeros = int(asStr[ (asStr.find("-", 1) + 1) :])
        return float(round(number, numZeros + numDigits - 1))

    # Check for numbers > 9
    beforeDecimal = asStr.find(".")
    if (beforeDecimal == -1):
        return float(round(number, numDigits))

    return float(round(number, afterDecimal - beforeDecimal + numDigits - 1))

使用log可能是正确的选择,但是如果由于某种原因而对您没有帮助,那么它将起作用。