Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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 将数字四舍五入到最接近的基数10_Python_Python 2.7_Numpy - Fatal编程技术网

Python 将数字四舍五入到最接近的基数10

Python 将数字四舍五入到最接近的基数10,python,python-2.7,numpy,Python,Python 2.7,Numpy,我想得到输入n的最近的基数10(例如10、100、1000),称为new\n。例如,99获取100(非10),551获取1000(非100) 我尝试的是使用np.log10提取输入数字n的幂,并使用它来幂10 import numpy as np n = 0.09 new_n = 10**(int(round(np.log10(n)))) print new_n n = 35 new_n = 10**(int(round(np.log10(n)))) print new_n n = 999

我想得到输入
n
的最近的基数10(例如10、100、1000),称为
new\n
。例如,
99
获取
100
(非
10
),
551
获取
1000
(非
100

我尝试的是使用
np.log10
提取输入数字
n
的幂,并使用它来幂
10

import numpy as np

n = 0.09
new_n = 10**(int(round(np.log10(n))))
print new_n

n = 35
new_n = 10**(int(round(np.log10(n))))
print new_n

n = 999
new_n = 10**(int(round(np.log10(n))))
print new_n

n = 4655
new_n = 10**(int(round(np.log10(n))))
print new_n

> 0.1
> 100
> 1000
> 10000

问题是像
35
its
np这样的数字。log10(n)
(我希望用作幂)是
1.544068
,四舍五入是
2
。因此结果是
100
,而不是
10
。或者
4655
的结果是
10000
。如何将数字四舍五入到最接近的10进制数字?

在获得指数后,在线性空间中添加一个复选框(可能进行更正):

n = np.array([0.09,35,549,551,999,4655])
e = np.log10(n).round()
#array([-1.,  2.,  3.,  3.,  3.,  4.])
那么,这个数字是更接近“四舍五入”的答案还是之前的10度

new_n = np.where(10**e - n <= n - 10**(e - 1), 10**e, 10**(e - 1))
#array([  1.00000000e-01,   1.00000000e+01,   1.00000000e+02,
#         1.00000000e+03,   1.00000000e+03,   1.00000000e+03])

new\u n=np。其中(10**e-n在获得指数后在线性空间中添加一个检查(带可能的校正):

n = np.array([0.09,35,549,551,999,4655])
e = np.log10(n).round()
#array([-1.,  2.,  3.,  3.,  3.,  4.])
那么,这个数字是更接近“四舍五入”的答案还是之前的10度

new_n = np.where(10**e - n <= n - 10**(e - 1), 10**e, 10**(e - 1))
#array([  1.00000000e-01,   1.00000000e+01,   1.00000000e+02,
#         1.00000000e+03,   1.00000000e+03,   1.00000000e+03])

new_n=np。其中(10**e-n你可以通过在记录日志之前缩放数字来实现你想要的。将每个值乘以
sqrt(10)/5.5
,你应该得到你想要的结果:

n = np.array([0.09,35,549,551,999,4655]) # borrowed test values from @DYZ
multiplier = np.sqrt(10) / 5.5
results = 10**np.log10(multiplier * n).round()
# array([  1.00000000e-01,   1.00000000e+01,   1.00000000e+02,
#          1.00000000e+03,   1.00000000e+03,   1.00000000e+03])

在获取日志之前,您可以通过缩放数字来实现所需。将每个值乘以
sqrt(10)/5.5
,您应该会得到所需的结果:

n = np.array([0.09,35,549,551,999,4655]) # borrowed test values from @DYZ
multiplier = np.sqrt(10) / 5.5
results = 10**np.log10(multiplier * n).round()
# array([  1.00000000e-01,   1.00000000e+01,   1.00000000e+02,
#          1.00000000e+03,   1.00000000e+03,   1.00000000e+03])
你可以试试这个:

import np
new_n = 10**(np.floor(np.log10(n)-np.log10(0.5)))
你可以试试这个:

import np
new_n = 10**(np.floor(np.log10(n)-np.log10(0.5)))


尝试使用
math.floor
而不是round.@DeepakSingh
math.floor
始终向下舍入,即使对于
n=999
。您对“最近”的定义是什么?@Craig Like 499应该得到100,因为499比以10为基数的1000更接近100。799应该得到1000。@unutbu哦,这是真的!很抱歉。那么501应该得到100。让我修正并尝试。谢谢。尝试使用
math.floor
而不是round。@DeepakSingh
math.floor
始终向下舍入,即使对于
n=999
。什么你对“最近”的定义是什么?@Craig Like 499应该得到100,因为499比以10为基数的1000更接近100。799应该得到1000。@unutbu哦,这是真的!很抱歉。那么501应该得到100。让我修正并尝试一下。谢谢。数字应该接近其10度的整数。Like 499应该得到100,但501应该得到1000。@jan 501更接近100(401)超过1000(499).你对亲密度的精确定义是什么?对不起,我错过了中点。小于550的应该得到100。大于550的应该得到1000。550可以是任意的。我的代码就是这样做的。为了清晰起见,我加了549和551。数字应该接近它的10度。比如499应该得到100,但501应该得到1000。@jan 501接近100(401)比1000(499)。你对亲密度的精确定义是什么?对不起,我错过了中点。小于550的都应该得到100。大于550的都可以得到1000。550可以是任何值。我的代码就是这么做的。为了清晰起见,我加了549和551。它有效,谢谢!你介意解释一下为什么乘数是
np.sqrt(10)/5.5
?(请注意,对于其他人来说,这种方法将中点向下舍入,为什么DYZ的一个是向上舍入的。顺便说一句,我对这两种方法都同意)我使用的乘数将你想要的中点(例如,
5.5
55
550
)转换为对数刻度上的等效中点(
10**0.5
10**1.5
10**2.5
)。我怀疑精确中点值的舍入方向归结为浮点舍入错误。以稍微不同的方式编写方程式可能会使其向另一个方向舍入。它可以工作,谢谢!您介意解释为什么乘法器是
np.sqrt(10)/5.5
?(请注意,对于其他人来说,这种方法将中点向下舍入,为什么DYZ的一个是向上舍入的。顺便说一句,我对这两种方法都同意)我使用的乘数将你想要的中点(例如,
5.5
55
550
)转换为对数刻度上的等效中点(
10**0.5
10**1.5
10**2.5
).我怀疑精确中点值的舍入方向归结为浮点舍入错误。以稍微不同的方式写入等式可能会使其向另一个方向舍入。