【问题标题】:On significant figures of numbers in python [closed]关于python中数字的重要数字[关闭]
【发布时间】:2014-05-19 23:15:19
【问题描述】:

您好,我有一个有点奇怪的问题。我正在转换一个数字列表(代表物理测量值),其中每个数字都以任意单位的特定精度报告,具体取决于它来自的研究。这是我的意思的一个例子:

[...,105.0,20.0,3.5,4.25,9.78,7.2,7.2] 

这些当然是类型:

<type 'numpy.float64'>.

如果我打印出最后一个数字,例如:

print list[-1]
>>> 7.2

但是,如果以这种方式访问​​,我会得到:

7.2000000000000002

我知道浮点数默认为 64 位,因此使用它们进行计算(即 - 转换此测量列表)会返回一个 64 位的转换值。以下是转换后的值的示例:

[105.27878958,20.0281600192,3.47317185649,4.27596751688,9.82706595042,7.27448290596,7.26291009446]

以任何一种方式访问​​它们(使用打印或不使用),都会返回一个 64 位数字。但显然还有其他事情发生,否则打印功能将不知道如何显示真实的测量值。我想将转换后的值报告为与原始测量值相同的准确度。有没有办法在 python 中做到这一点?

【问题讨论】:

  • 看看here。取决于您是要对数字进行四舍五入还是只是通过修改打印的内容或相应地格式化为字符串来修改输出。
  • 我希望它与测量值完全相同。当我显式打印转换列表的编号时,我希望它打印出与相应测量值相同的位数。
  • 我看了看 - 所有解决方案看起来都像是在四舍五入到某个指定的预定义位置。
  • print 函数不显示“真实测量值”,它具有一些内置的舍入功能,可以让我们的人类大脑免于底层浮点表示的恐惧。
  • 每个程序员都应该知道的关于浮点运算的知识floating-point-gui.de 使用 Numpy 的目的是可以访问用 C 甚至 Fortran 编写的算法和库来处理数据。这意味着数据将存储在 C 中。如果您想要精确的精度,您可以使用标准库中的 Decimal 模块,但是您将不会获得特定于 Numpy 的加速,因为数据随后将存储为 Python 对象而不是在 C 中。

标签: python numpy significant-digits


【解决方案1】:

你有三个问题:

1) 如何确定输入中的小数位数?

如果您的 Python 代码字面意思是 [...,105.0,20.0,3.5,4.25,9.78,7.2,7.2],那么您就不走运了。您已经丢失了所需的信息。

相反,如果您将数字列表作为某种输入字符串,那么您就有了所需的信息。您可能已经有如下代码:

for line in input_file:
    data = [float(x) for x in line.split(',')]

需要在转成float之前记录小数点右边的位数,例如:

for line in input_file:
    places = [len(x.partition('.')[2]) for x in line.split(',')]
    data = [float(x) for x in line.split(',')]

2) 我如何存储这些信息?

这取决于你。抱歉,如果没有看到您的整个程序,我无法为您提供帮助。

3) 如何格式化输出以四舍五入到小数位数?

使用% 运算符或{} 样式格式,如下所示:

print '%.*f' % (places[i], data[i]) 

【讨论】:

  • 这正是我想要的——谢谢。我确实有一个数据文件,所以信息应该都在那里。我会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2014-10-03
  • 1970-01-01
相关资源
最近更新 更多