0

我有一些 json 对象,当我将它们转换为 python 中的字典时,它们会四舍五入:

-112.07393329999999  ->  -112.0739333

我的代码是:

for line in open("c:\\myfile","r+").readlines():          
     d = json.loads(line)
     logtv = d['logtv']
4

2 回答 2

6

它只是相同(二进制,64 位)数字的更紧凑表示。

In [12]: -112.07393329999999 == -112.0739333
Out[12]: True

In [17]: struct.pack('d', -112.0739333)
Out[17]: 've\xbcR\xbb\x04\\\xc0'

In [18]: struct.pack('d', -112.07393329999999)
Out[18]: 've\xbcR\xbb\x04\\\xc0'

如果您想要这个精确的小数,则无法在 JSON 中将其表示为数字。您必须在 JSON 中使用字符串,在 python 中使用小数/字符串,在数据库中使用小数字段。

 

SQL Server 浮点数最多也是 64 位(53 位有效位)。

于 2013-04-22T20:39:20.927 回答
3

答案是不要使用浮点数。在大多数语言中,浮点数只有大约 6 位有效数字,对于双精度数并没有太多(注意 python 浮点数是双精度数)。如果您知道确切的精度,请使用小数。对于 JSON,将其作为字符串或带隐含小数点的 int 发送。

肥皂盒:花车被过度使用了。任何你不会用科学记数法表示的东西都不应该使用浮点数,因为那是它们真正的底层。

注意:数据库通常不使用浮点数,它们使用定点数。这正是小数的含义。

澄清

在编写 json 文件之前,请执行以下操作

with  open("c:\\myfile","w") as my_file:
    for key in d:
        if isinstance(d[key], Decimal):
            d[key] = str(d[key])
    my_file.write(json.dumps(d))

然后在读取 json 时,您可以将值按原样放入数据库中,或者如果您需要更多地使用它,可以将其转换回 Decimal。

于 2013-04-22T20:51:58.443 回答