Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何将浮点向下舍入到1个有效数字_Python_Floating Point - Fatal编程技术网

Python-如何将浮点向下舍入到1个有效数字

Python-如何将浮点向下舍入到1个有效数字,python,floating-point,Python,Floating Point,我想把一个浮点数舍入到一个特定的有效位数。与此答案非常相似:但它应该始终向下取整,而不是正常的round()行为。我不能使用math.floor(),因为它将浮点值转换为int 基本上,0.45应该变成0.4,而不是0.5。 而1945.01应该变成1000.0,而不是2000.0 round(number[, ndigits]) 返回小数点后四舍五入到ndigits位的浮点值数字。如果省略ndigits,则默认为零。结果是一个浮点数。将值四舍五入到最接近幂减去ndigit的10倍;如果两个

我想把一个浮点数舍入到一个特定的有效位数。与此答案非常相似:但它应该始终向下取整,而不是正常的
round()
行为。我不能使用
math.floor()
,因为它将浮点值转换为int

基本上,
0.45
应该变成
0.4
,而不是
0.5
。 而
1945.01
应该变成
1000.0
,而不是
2000.0

 round(number[, ndigits])
返回小数点后四舍五入到ndigits位的浮点值数字。如果省略ndigits,则默认为零。结果是一个浮点数。将值四舍五入到最接近幂减去ndigit的10倍;如果两个倍数相等接近,则舍入将远离0(例如,舍入(0.5)为1.0,舍入(-0.5)为-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

我认为这是一个简单的好方法:

def convert(number, interval):
    return int(number/interval)*interval
样本输出:

1923,1000 -> 1000
12.45,0.1 -> 12.4

科学表现似乎是一条出路,但对我来说,数字技术通常比弦技术更快。您确实会偶尔遇到浮点错误,但是

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四舍五入与将
下限
更改为
ceil
四舍五入
一样简单。用数字计算尾数和指数而不是转换成字符串的另一个好处是,可以很容易地更改sigfears的数量,而不是将1945.01四舍五入到1000.0,是吗?他希望这个数字总是向下四舍五入<代码>第四轮(0.5)在这种情况下应该给出
0
。如果这个问题不是真的重复,请告诉我,我会标记reopen@JoranBeasley这不是复制品,不是复制品。他不想做
1999->2000
,而是
1999->1000
def floor(number,pos):返回float(int(number*(10**pos))/(10**pos))
然后
floor(0.45,1)
->
0.4
floor(1945.01,-3)
->
1000.0
对不起。。。重新开始在这种情况下,用户需要每次指定间隔。问题只需要第一个有效数字和幂,我认为问题必须更清楚。因为我不明白为什么1945.1会转换成1000。而不是1900年或1940年<代码>有效_1(1999)
返回
2000
这将在极端情况下失败,例如
舍入(decimal.decimal('1.999999999999999999999')
,但我猜它与浮点一起工作。即使是浮点也会出现浮点错误:
舍入(15.64,3)
->
15.60000000000001
谢谢!将第5行的
floor
更改为
ceil
以进行取整,但将其更改为
round
会使其从零开始取整,而不是从零开始取整:
roundZero(2.57)==2.6,roundZero(-2.57)=-2.6
。如何使其接近零?