给定一个数字,我想找到最接近2,5,6或0的第百位的值。
是否存在执行此操作的舍入功能或如何以编程方式执行此操作?
例如,2.567会给2.566,2.5652会给2.565,2.5613会给2.562。
答案 0 :(得分:1)
你的问题很不清楚,但希望这样的事情会让你朝着正确的方向前进:
vals = [ 0, 2, 5, 6 ]
number = 4.296
distances = [ abs(x - number) for x in vals]
closest = vals[distances.index(min(distances))]
这样可以获得number
最接近的列表中的值。
答案 1 :(得分:1)
有一种称为Python文档的东西:
round( number [,ndigits] )
返回浮点值编号 舍入到小数点后的数字位数。如果ndigits是 省略,默认为零。结果是一个浮点数。 将值四舍五入为函数减去10的最接近倍数 ndigits;如果两个倍数相等,则舍入就完成了 从0开始(例如,round(0.5)为1.0,round(-0.5)为-1.0)。
注意浮点数的round()行为可能会令人惊讶:for 例如,round(2.675,2)给出2.67而不是预期的2.68。这个 这不是一个错误:它是大多数小数部分的结果 不能完全表示为浮点数。请参阅浮点 算术:问题和限制以获取更多信息。
因此,舍入可以简单如下:
print round(2.235, 2)
# Output: 2.24
从这里开始,您可以编写一些简单的代码来测量百分位数距离最近的距离为2,5,6,0。
答案 2 :(得分:0)
要从第100位开始分离小数部分,您可以通过乘以10来提升num
,然后将整数与小数部分分开。例如,3.14159将变为31.4159,整个部分将为31,小数部分将为0.4159。
现在,您可以使用bisect.bisect
来选择最接近小数部分的数字(例如0,2,5或6):
import bisect
def closest_hundredth(num, digits=[0, 2, 5, 6]):
digits = [d/10.0 for d in digits] + [1.0]
num *= 10
whole = int(num)
frac = num-whole
boundary_vals = [(digits[i]+digits[i+1])/2 for i in range(len(digits)-1)]
idx = bisect.bisect(boundary_vals, frac)
rounded_frac = digits[idx]
new_num = whole + rounded_frac
new_num /= 10
return new_num
tests = [
(3.14159, 3.15),
(3.156, 3.16),
(3.13159, 3.12),
(0, 0),
(0.01, 0.02),
(0.011, 0.02),
(0.08, 0.10)
]
for num, answer in tests:
result = closest_hundredth(num)
assert result == answer
在这里使用bisect.bisect
可能有点矫枉过正,因为只有四种选择 - if语句可能更快。但我发现它是一种可读的方式来表达这个想法,而不必编写繁琐的if语句。如果有许多边界值可供选择,它也可以很好地扩展(O(log(n))
的复杂度O(n)
而不是if-statements
。