0

我在“.fits”表中有一个存储值(这应该没有问题)。我读了表,然后做

In [2]: a['RA_touse'][0]
Out[2]: 161.65813

这是真正的存档值。但是,然后我这样做:

In [3]: print a['RA_touse'][0]
161.658

我得到一个截断的值。我将 python 与 POSTGRES 一起使用,这种行为会带来一些精度问题。

谁能向我解释这种行为,以及如何解决?我需要我的数据保持相同的格式,而不是更改它(即,repr() 函数会将所有内容都转换为字符串)。

非常感谢!

为清楚起见进行编辑:

我正在使用 python 脚本来创建数据库。我所做的是

con = psycopg2.connect('todatabase')
cur = con.cursor()
for i in vector_of_something:
    value1 = table['column1'][i]
    value2 = table['column2'][i]
    values = (values1,values2)
    values = [str(value) for value in values]
    command = 'INSERT INTO table values (%s,%s)'
    cur.execute(command,values)
con.commit()

问题是我在数据库中得到“161.658”,而不是 1.65813。

4

3 回答 3

2

您应该使用带有最大小数点数的字符串格式。

print '%.10f' % a['RA_touse'][0]
于 2013-04-30T15:25:55.790 回答
0

当您使用浮点值时,您必须记住,您在代码或应用程序接口中以 10 为基数编写它们(通常),但它们以 2 为基数存储。整数值也是如此,但不是那里有一个问题,因为所有整数都可以在任何基础上准确表示。这里有一些十进制>二进制转换示例来说明问题。

dec   bin
.1    .000110011(0011 repeating)
.2    .0011(r)
.25   .01
.3(r) .01(r)
.5    .1

易于以 10 为基数表示的值并不总是可以以 2 为基数进行有限表示。 Decimal对象的存在专门用于满足保持浮点运算的十进制精度的需要。

于 2013-04-30T15:42:54.957 回答
0

我发现问题是字符串转换。最后,我将所有内容都转换为字符串以格式化 POSTGRESQL 的所有内容。如果我做

values = [repr(vaue) for value in values]

上传的值是正确的。

谢谢你的帮助!

于 2013-04-30T15:54:16.417 回答