[rules-users] [rules user] different behavior on double type

Wolfgang Laun wolfgang.laun at gmail.com
Mon Mar 26 07:50:21 EDT 2012


4.0.7 is rather old. 5.1.1 and later do not exhibit this behaviour.

However, it should be noted that comparing double values using == is a
precarious approach. For instance, 99.9 (the mathematical number)
cannot be represented as a double machine number. Hence, you do not
truly test for
equality with that number, just with its approximation by some machine
number.

-W

On 26/03/2012, Zeke <xanadu860122 at gmail.com> wrote:
> Hi, guys:
>   I am using Drools 4.0.7. I find a strange behavior. When my LHS is
> "Message( varDouble == 99.9 )" and "varDouble" equals "new Double(99.9)",
> the condition is true. But when my LHS is "Message( types.doubleType ==
> 99.9 )" and the "doubleType" field is also equal to "new Double(99.9)", the
> condition is false. I debug the code, and find that:
>
>   When the LHS is "Message( varDouble == 99.9 )", the logic will handle the
> literal 99.9 as *Double.valueOf( “99.9” )*, and the comparison is between
> *(new
> Double(99.9)).doubleValue(*) and *Double.valueOf( “99.9” ).doubleValue()*,
>   When the LHS is "Message( types.doubleType == 99.9 )", the logic is
> different from above. The comparison is between *new BigDecimal((Double)
> 99.9, MathContext.DECIMAL64)* (which double value is 99.90000000000001) and
> *new BigDecimal(“99.9”, MathContext.DECIMAL64)* (which double value is
> 99.9).
>
>   I think we need make things consistent. "varDouble" and
> "types.doubleType" are of the same type and value. It doesn't make sense to
> have different behavior just because of one field is nesting while the
> other is not.  I know Drools is using MVEL to evaluate the condition. But I
> am not sure it is a MVEL bug or Drools uses MVEL wrong. It will be much
> appreciated if you can give me any comments!
>




More information about the rules-users mailing list