如何在列表或np.array中保留尾随零?
我正在用Python做一些统计分析,我有这样一个数据集:
test=[0.200,0.220,0.220,0.120,0.330,0.330]
Python会自动把它转换成[0.2, 0.22, 0.22, 0.12, 0.33, 0.33],但实际上这些零在我的计算中是很重要的,所以我想在数组中保留它们。我知道我可以导入decimal模块,用Decimal来处理单个数值,但我该如何在列表或np.array中保留所有的尾随零呢?
想象一下,你正在用Python脚本输入实验数据,这些数据精确到小数点后三位,所以我想记录下0.020意味着在第三位实际上是0。我该如何做到这一点?这对化学家或工程师来说是个非常重要的问题。
我需要这样做,因为我必须跟踪有效数字,以便进行下一步计算……理想情况下,我需要计算有效数字的数量,在这个例子中是3,并在下一步计算中使用它,这就像是绘制直方图,直方图的宽度与有效数字的数量有关。
1 个回答
我觉得这个问题本身有点问题。其实0.200
和0.2
没有什么实质性的区别,而且计算机并不是用十进制来存储数据,而是用二进制。比如说,计算机可能会把0.2
存储成0.20000000000000000000001
,这只是因为精度的问题,但由于二进制表示的限制,实际上在存储层面上并不能截断。
如果你只是想把数值打印成三位有效数字,可以使用
print "%.3f" % float_var
如果你想把所有未来的计算都四舍五入到三位小数,可以使用
round(float_var,3)
不过就实际计算而言,0.200
和0.2
在计算上没有任何区别,无论你是用Python、C、Java,还是用铅笔和纸。
补充一下:如果你真的需要有效数字,可以在列表中使用Decimal对象。https://docs.python.org/2/library/decimal.html提供了一种比较快速的方法,可以批量将字符串转换为Decimal:
data = map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split())
或者如果你已经有一个浮点数数组需要转换为三位有效数字,可以这样做:
import decimal
def toDecimal(x): # x is a float.
return decimal.Decimal(str(x)).quantize(decimal.Decimal('1.000'))
data = map(toDecimal, float_var_list)
至于计算有效数字的数量,我觉得没有内置的函数可以做到,但通过处理字符串,你可以很容易地得到答案。
def numDigits(x): # x is a Decimal object.
splitDecimal = str(x).split(".")
return len(splitDecimal[1])