我有一些 json 对象,当我将它们转换为 python 中的字典时,它们会四舍五入:
-112.07393329999999 -> -112.0739333
我的代码是:
for line in open("c:\\myfile","r+").readlines():
d = json.loads(line)
logtv = d['logtv']
我有一些 json 对象,当我将它们转换为 python 中的字典时,它们会四舍五入:
-112.07393329999999 -> -112.0739333
我的代码是:
for line in open("c:\\myfile","r+").readlines():
d = json.loads(line)
logtv = d['logtv']
它只是相同(二进制,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 中使用小数/字符串,在数据库中使用小数字段。
答案是不要使用浮点数。在大多数语言中,浮点数只有大约 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。