DRL规则中金额处于8.7-8.89区间时==运算符匹配失效问题咨询
浮点数精确匹配失效:8.7-8.89区间DRL规则不触发的原因
问题场景
当交易金额处于8.7到8.89区间时,DRL规则中的==精确匹配完全失效;其他区间的金额(如1.01、4.45、8.55、8.69)使用==能正常匹配,且<=/>=等范围运算符在全区间均正常工作。涉及的DRL规则片段如下:
txnRuleInfo: TransactionRuleInfo( transactionInfo.transactionAmount==8.7, transactionInfo.transactionType==TransactionType.SALE )
核心原因
这是浮点数二进制存储的精度缺陷导致的:
- 诸如8.7这类十进制小数,无法被二进制浮点数(如Java的
float或double)精确存储,实际存储的是一个接近但不等于原值的近似值。例如8.7在内存中可能是8.699999809265137或8.700000286102295这类近似值,只是显示时被四舍五入为8.7。 ==运算符要求两个值的二进制表示完全一致才会匹配。8.7-8.89区间内的数值,其实际存储的近似值与你写的字面量的近似值刚好不重合;而其他区间的数值可能因偏差方向或幅度巧合,让字面量和实际值的近似值完全一致,所以能触发匹配。
解决建议
- 放弃
==精确匹配,改用带误差容忍的范围判断,例如:transactionAmount >= 8.699 && transactionAmount <= 8.701,根据业务需求设置合理的误差区间。 - 改用精确的十进制类型(如Java的
BigDecimal)存储金额,DRL支持对BigDecimal的精确比较,从根源上避免浮点数精度问题。
内容的提问来源于stack exchange,提问作者user1487036
相关产品推荐
相关产品推荐

