[rules-users] [rules user] different behavior on double type
Mark Proctor
mproctor at codehaus.org
Mon Mar 26 22:18:23 EDT 2012
On 27/03/2012 03:01, Zeke wrote:
> Whether the comparison is precarious or not should depend on how you
> handle the literal. If you handle 99.9 as BigDecimal("99.9") which
> precision can be controlled, you can trust the comparison.
>
> Anyway, since it has different behavior for these two cases, it should
> be a bug, right? I just want to know it is Drools' bug or MVEL's... If
> it is MVEL's, I may need ask for MVEL guys' help...
If you need this fixed, you'll need to move to Drools 5.3.
Mark
>
> On 26 March 2012 19:50, Wolfgang Laun <wolfgang.laun at gmail.com
> <mailto:wolfgang.laun at gmail.com>> wrote:
>
> 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
> <mailto: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!
> >
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20120327/198bf36b/attachment.html
More information about the rules-users
mailing list