给定一个数字,我想找出最接近 2、5、6 或 0 的百分位的值是多少。
是否有一个舍入函数可以做到这一点,或者我如何以编程方式做到这一点?
例如,2.567 将给出 2.566,2.5652 将给出 2.565,2.5613 将给出 2.562。
给定一个数字,我想找出最接近 2、5、6 或 0 的百分位的值是多少。
是否有一个舍入函数可以做到这一点,或者我如何以编程方式做到这一点?
例如,2.567 将给出 2.566,2.5652 将给出 2.565,2.5613 将给出 2.562。
有一个叫做 Python 文档的东西:
回合(数字[,ndigits])
返回小数点后四舍五入到 ndigits 位的浮点值数字。如果省略 ndigits,则默认为零。结果是一个浮点数。值四舍五入到最接近 10 的幂减去 ndigits 的倍数;如果两个倍数相等,则从 0 开始舍入(例如,round(0.5) 为 1.0,round(-0.5) 为 -1.0)。
注意 浮点数的 round() 行为可能令人惊讶:例如,round(2.675, 2) 给出 2.67 而不是预期的 2.68。这不是错误:这是因为大多数小数部分不能完全表示为浮点数。有关详细信息,请参阅浮点算术:问题和限制。
因此,舍入可以很简单:
print round(2.235, 2)
# Output: 2.24
从这里开始,您可以编写一些简单的代码来测量从 2、5、6、0 到百分位最接近的距离。
你的问题很不清楚,但希望这样的事情能让你朝着正确的方向前进:
vals = [ 0, 2, 5, 6 ]
number = 4.296
distances = [ abs(x - number) for x in vals]
closest = vals[distances.index(min(distances))]
这将为您提供列表中number
最接近的值。
要从百位数字开始分离小数部分,您可以num
通过乘以 10 来提高,然后将整体与小数部分分开。例如,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