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
itsnp这样的数字。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.@DeepakSinghmath.floor
始终向下舍入,即使对于n=999
。您对“最近”的定义是什么?@Craig Like 499应该得到100,因为499比以10为基数的1000更接近100。799应该得到1000。@unutbu哦,这是真的!很抱歉。那么501应该得到100。让我修正并尝试。谢谢。尝试使用math.floor
而不是round。@DeepakSinghmath.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
).我怀疑精确中点值的舍入方向归结为浮点舍入错误。以稍微不同的方式写入等式可能会使其向另一个方向舍入。