如何避免在python中舍入浮点数?

时间:2013-04-22 20:37:10

标签: python json floating-point

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

-112.07393329999999  ->  -112.0739333

我的代码是:

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

2 个答案:

答案 0 :(得分: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 Floats are at most 64-bit (53-bit significand) as well.

答案 1 :(得分: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。