Python从文件中读取数据并转换为双精度

时间:2014-05-24 18:26:04

标签: python numpy

我一直在使用python读取ASCII数据文件。然后我将数据转换为numpy数组。 但是,我注意到数字正在四舍五入。

E.g。我在文件中的原始值是:2368999.932089

哪个python已四舍五入到:2368999.93209

这是我的代码示例:

import numpy as np
datafil = open("test.txt",'r')

tempvar = []
header = datafil.readline()
for line in datafil:
    word = line.split()
    char = word[0]      # take the first element word[0] of the list
    word.pop()          # remove the last element from the list "word"
    if char[0:3] >= '224' and char[0:3] < '225':
        tempvar.append(word)

strvar = np.array(tempvar,dtype = np.longdouble)  # Here I want to read all data as double
print(strvar.shape)

var = strvar[:,0:23]
print(var[0,22])      # here it prints 2368999.93209 but the actual value is  2368999.932089

任何想法的人?

阿贝丁

2 个答案:

答案 0 :(得分:1)

我认为这不是您的代码问题。它是Python中常用的浮点表示法。看到 https://docs.python.org/2/tutorial/floatingpoint.html

我认为当你打印它时,print已经将你的号码格式化为str

In [1]: a=2368999.932089

In [2]: print a
2368999.93209

In [3]: str(a)
Out[3]: '2368999.93209'

In [4]: repr(a)
Out[4]: '2368999.932089'

In [5]: a-2368999.93209
Out[5]: -9.997747838497162e-07

答案 1 :(得分:0)

我不完全确定您要尝试做什么,但仅使用仅包含

的test.txt进行了简化
asdf
2368999.932089

然后是代码:

import numpy as np
datafil = open("test.txt",'r')

tempvar = []
header = datafil.readline()
for line in datafil:
    tempvar.append(line)
print(tempvar)
strvar = np.array(tempvar, dtype=np.float)
print(strvar.shape)
print(strvar)

我得到以下输出:

$ python3 so.py 
['2368999.932089']
(1,)
[ 2368999.932089]

似乎工作正常。

修改:已使用您提供的行进行了更新,因此test.txt为

asdf
t JD a e incl lasc aper truean rdnnode RA Dec RArate Decrate metdr1 metddr1 metra1 metdec1 metbeta1 metdv1 metsl1 metarrJD1 beta JDej name 223.187263 2450520.619348 3.12966 0.61835 70.7196 282.97 171.324 -96.2738 1.19968 325.317 35.8075 0.662368 0.364967 0.215336 3.21729 -133.586 46.4884 59.7421 37.7195 282.821 2450681.900221 0 2368999.932089 EH2003

和代码

import numpy as np
datafil = open("test.txt",'r')

tempvar = []
header = datafil.readline()
for line in datafil:
    tempvar.append(line.split(' '))
print(tempvar)
strvar = np.array(tempvar[0][-2], dtype=np.float)
print(strvar)

我的最后print仍然输出2368999.932089。所以我猜这是一个平台问题?如果您强制dtype=np.float64dtype=np.float128会怎样?其他一些健全性检查:您是否尝试过将文本转换为浮点数之前吐出文本?你做了类似的事情会得到什么:

>>> np.array('2368999.932089')
array('2368999.932089', 
  dtype='<U14')
>>> float('2368999.932089')
2368999.932089