[英]Python - How to round down a float to 1 significant digit
我想将浮点数向下舍入到特定数量的有效数字。 非常类似于这个答案: https : //stackoverflow.com/a/3411435/281021但不是正常的round()
行为,它应该始终向下舍入。 我不能使用math.floor()
因为它将float转换为int。
基本上, 0.45
应该变为0.4
而不是0.5
。 并且1945.01
应该变为1000.0
而不是2000.0
。
科学表征似乎是要走的路,但数字技术通常比字符串技术更快。 你确实得到偶然的浮点错误...
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的数量
使用科学概念来获取有效数字和功率,并计算结果
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
我认为这是一个很好而简单的方法:
def convert(number, interval):
return int(number/interval)*interval
样本输出:
1923,1000 -> 1000
12.45,0.1 -> 12.4
round(number[, ndigits])
返回舍入到小数点后的ndigits数字的浮点值数字。 如果省略ndigits,则默认为零。 结果是一个浮点数。 将值四舍五入为函数减去ndigits的最接近的10的倍数; 如果两个倍数相等,则舍入远离0(因此,例如,round(0.5)为1.0,round(-0.5)为-1.0)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.