繁体   English   中英

Python - 如何将浮点数舍入为1位有效数字

[英]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改为ceilround一样简单。 以数字方式计算尾数和指数而不是转换为字符串的另一个好处是可以轻松更改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)。

https://docs.python.org/2/library/functions.html#round

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM