我有一些json对象,当我在python中将它们转换为字典时,它们将会舍入:
-112.07393329999999 -> -112.0739333
我的代码是:
for line in open("c:\\myfile","r+").readlines():
d = json.loads(line)
logtv = d['logtv']
答案 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。