考虑将字节数转换为可读字符串的函数:
def sizeof_fmt(num, suffix='B'):
for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']:
if abs(num) < 1024.0:
return "%3.1f %s%s" % (num, unit, suffix)
num /= 1024.0
return "%.1f %s%s" % (num, 'Yi', suffix)
我正在寻找一个函数,给定人类可读的字符串,该函数将以字节为单位返回该大小(最小,最大)的范围,占小数点后1个数字。 例如:
human_readable_to_range('1 KiB') => 1024, 1075
1 KiB在1075处停止,因为1076是1.1 KiB
human_readable_to_range('1.3 KiB') => 1281, 1382
human_readable_to_range('9.7 MiB') => 10118759, 10223615
我试图用这种方式解决它:
def human_readable_to_range(size):
MULTIPLIERS = {
'KiB': 2**10,
'MiB': 2**20
}
number, unit = size.split(' ')
multiplier = MULTIPLIERS[unit]
rough_value = float(number) * multiplier
min_ = rough_value - multiplier * 0.5
max_ = rough_value + multiplier * 0.5
但是此解决方案仅给出了近似值
答案 0 :(得分:0)
您可以使用二进制搜索:从一个近似值开始,根据乘数使其成为范围,然后根据将值转换为人类可读形式的方式搜索该范围。
答案 1 :(得分:0)
由于您假设输入中仅包含1个小数位,因此将0.05
加和减去给定的数字,并将其用作最大和最小数量,然后乘以单位。
def human_readable_to_range(size):
MULTIPLIERS = {
'KiB': 2**10,
'MiB': 2**20
}
number, unit = size.split(' ')
minnum = float(number) - 0.05
maxnum = float(number) + 0.05
multiplier = MULTIPLIERS[unit]
return round(minnum * multiplier), round(maxnum * multiplier)