我想将浮点数向下舍入到特定的有效位数。与此答案非常相似:https://stackoverflow.com/a/3411435/281021但不是正常的round()
行为,它应该始终向下舍入。我不能使用math.floor()
,因为它将浮动转换为int。
基本上,0.45
应该变为0.4
而不是0.5
。
1945.01
应该变为1000.0
而不是2000.0
。
答案 0 :(得分:2)
科学表征似乎是要走的路,但数字技术通常比字符串技术更快。你确实得到了偶然的浮点错误......
from math import *
def roundDown(x, sigfigs=1): #towards -inf
exponent = floor(log10(copysign(x,1))) #we don't want to accidentally try and get an imaginary log (it won't work anyway)
mantissa = x/10**exponent #get full precision mantissa
# change floor here to ceil or round to round up or to zero
mantissa = floor(mantissa * 10**(sigfigs-1)) / 10**(sigfigs-1) #round mantissa to sigfigs
return mantissa * 10**exponent
向零或+ inf舍入就像将floor
更改为ceil
或round
一样简单。以数字方式计算尾数和指数而不是转换为字符串的另一个好处是可以轻松更改sigfigs的数量
答案 1 :(得分:0)
使用科学概念获取有效数字和幂,并计算结果
def significant_1 (s):
l = len(str(s)) ####make sure there is enough precision
a = ('%.' + str(l) + 'E') % decimal.Decimal(s)
#print (a)
significate_d = a.split(".")[0]
times = a.split("E")[1]
result = int(significate_d) * (10 ** int(times))
return result
print (significant_1(1999))
print (significant_1(1945.01))
print (significant_1(0.45))
输出:
1000
1000
0.4
答案 2 :(得分:0)
我认为这是一种简单明了的方式:
def convert(number, interval):
return int(number/interval)*interval
示例输出:
1923,1000 -> 1000
12.45,0.1 -> 12.4
答案 3 :(得分:-2)
round(number[, ndigits])
将浮点值数字舍入为小数点后的数字位数。如果省略ndigits,则默认为零。结果是一个浮点数。将值四舍五入为函数减去ndigits的最接近的10的倍数;如果两个倍数相等,则舍入远离0(因此,例如,round(0.5)为1.0,round(-0.5)为-1.0)。