到1位有效数字的舍入误差及根据误差位数舍入值
我正在尝试写一个函数,这个函数可以接收一组错误值和与这些错误相关的参数,然后:
- 把错误值四舍五入到1个有效数字(这是一个约定俗成的做法)
- 把参数值四舍五入到与其相关的错误值的位数。
举个例子,如果我有这样的列表:
errors = [0.0097, 0.83, 0.05, 0.0045]
params = [0.0240, 7.85, 0.75, 12.5]
那么在应用这个函数后,得到的列表会是这样的:
errors_r = [0.01, 0.8, 0.05, 0.005]
params_r = [0.02, 7.9, 0.75, 12.500]
在这里,错误值首先被四舍五入到1个有效数字,然后参数值会根据错误值的位数进行四舍五入。
下面这个函数是从这个问题中提取的,如何在Python中将数字四舍五入到有效数字,它很好地完成了将错误值四舍五入到1个有效数字的工作:
from math import log10, floor
def round_to_1(x):
return round(x, -int(floor(log10(x))))
为了将params
列表中的值四舍五入到与其相关的错误值的位数,我可以使用round()函数,并传入错误值四舍五入后的小数位数,但我不太确定该如何得到这个数字。
1 个回答
7
你需要做的就是修改这个函数,让它接受第二个数字,这样它就知道要四舍五入到哪个位置。
def round_to_reference(x, y):
return round(x, -int(floor(log10(y))))
把这些都放在一起,你可以这样做:
errors_r = map(round_to_1, errors)
params_r = map(round_to_reference, params, errors_r)
有一点需要注意的是,这样做不会打印出带有正确数量的尾随零的数字。例如,
>>> round_to_reference(12.5, 0.005)
12.5
>>> round_to_reference(12.51234, 0.005)
12.512
这些数字虽然四舍五入得很正确,但你还需要做一些其他的事情,把它们转换成带有正确有效数字的字符串。