我想要一个变量代码,例如将0.91823舍入为0.92,但是数字0.00009384应该舍入为0.000094。我想这很容易,但是我找不到能胜任的工作。
答案 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
可能是正确的选择,但是如果由于某种原因而对您没有帮助,那么它将起作用。