如何在列表或np.array中保留尾随零?

时间:2014-07-07 16:37:19

标签: python arrays numpy rounding trailing

我正在使用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作为单个值但是如何将所有尾随零保留在列表或np.array中?

认为你是使用python脚本插入实验数据,数据是精确的,直到第三个数字所以我想跟踪0.020意味着在第三个数字实际上是0.我怎样才能实现这个任务?对于化学家或工程师来说,这是一个非常重要的问题。

我需要它,因为我必须跟踪下一次计算的重要数字...理想情况下,我必须计算在这种情况下3的重要数字的数量,并在下一次计算中使用它,这是一种历史使用与有效数字相关的bin宽度绘图。

1 个答案:

答案 0 :(得分:3)

我认为这个问题有点天生存在缺陷。 0.2000.2之间不仅没有真正的区别,而且计算机不会以十进制格式存储数据,只是二进制格式。 (为此,计算机可能仅仅因为精度问题而将0.2存储为0.20000000000000000000001,但由于二进制表示的限制,实际上不可能在存储级别截断。)

如果您只想使用三位有效数字打印,可以使用

print "%.3f" % float_var

如果您想将所有未来的计算四舍五入到三个小数点,请使用

round(float_var,3)

但就实际计算而言,没有什么可以从中获得的。无论您使用的是Python,C,Java还是铅笔和纸,0.200对计算的影响都与0.2相同。

编辑:如果您确实需要有效数字,则没有理由不能在列表中使用十进制对象。 https://docs.python.org/2/library/decimal.html提供了一种从字符串中大量转换它们的快速方法:

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])