使用jq对JSON中的十进制数值做除法时如何保留计算精度?
问题原因
你的jq命令存在语法逻辑错误,并不是精度丢失导致结果异常:
赋值符号=左右两侧都使用了.entries[]对数组做迭代,会触发jq的迭代器交叉组合逻辑,最终所有entry的timestamp字段都会被覆盖为数组最后一个entry的timestamp除以1000后的结果,和你预期的「每个entry单独处理自身timestamp字段」完全不符。
正确实现方法
通用jq方案
使用map函数对数组内的每个元素单独处理,用/=缩写实现原地修改即可,默认精度就能满足绝大多数场景需求:
jq '.entries |= map(.timestamp /= 1000.0)' data.json
如果需要指定输出的小数保留位数,可额外添加--decimal-digits参数,示例为保留6位小数:
jq --decimal-digits 6 '.entries |= map(.timestamp /= 1000.0)' data.json
高精度场景方案
如果对精度要求极高,要完全规避浮点数运算误差,可以改用Python处理:
python3 -c ' import json with open("data.json", "r", encoding="utf-8") as f: data = json.load(f) for entry in data["entries"]: entry["timestamp"] = entry["timestamp"] / 1000 with open("processed_data.json", "w", encoding="utf-8") as f: json.dump(data, f, indent=2) '
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

