jq中正确实现小数加法:解决预余额与金额求和偏差问题
解决浮点数求和精度不匹配问题
这是二进制浮点数的精度缺陷导致的——像-2865.59这类十进制小数无法被二进制浮点数精确存储,直接相加时会产生微小误差,导致计算结果和给定的balance不一致。
用以下jq方法可以得到正确的计算值:
方法:整数运算规避浮点误差
将所有数值放大为整数(针对两位小数的金额,乘以100)完成计算后,再缩小回原单位:
map({ prebalance, amount, balance, calculated_balance: (.prebalance * 100 + .amount * 100) / 100 })
验证示例数据
- 第一个对象:
(-2865.59 * 100) + (3000.00 * 100) = 13441,除以100后得到134.41,与balance一致 - 第二个对象:
(-1865.59 * 100) + (2000.00 * 100) = 13441,除以100后同样得到134.41
如果涉及更多小数位,只需调整放大倍数(比如三位小数乘1000),核心是用整数运算避免浮点精度丢失。
内容的提问来源于stack exchange,提问作者Madhuprathap
相关产品推荐
相关产品推荐

