Python打印和阅读时的价值不同

时间:2013-04-30 15:20:19

标签: python postgresql truncation

我在“.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。

3 个答案:

答案 0 :(得分:2)

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

print '%.10f' % a['RA_touse'][0]

答案 1 :(得分:0)

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

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

在基数10中易于表示的值在基数2中并不总是有限地表示。The Decimal object专门用于满足维护浮点运算的小数精度的需要。

答案 2 :(得分:0)

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

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

上传的值是正确的。

感谢您的帮助!