Whether the comparison is precarious or not should depend on how you handle the literal. If you handle 99.9 as BigDecimal(&quot;99.9&quot;) which precision can be controlled, you can trust the comparison.<br><br>Anyway, since it has different behavior for these two cases, it should be a bug, right? I just want to know it is Drools&#39; bug or MVEL&#39;s... If it is MVEL&#39;s, I may need ask for MVEL guys&#39; help...<br>
<br><div class="gmail_quote">On 26 March 2012 19:50, Wolfgang Laun <span dir="ltr">&lt;<a href="mailto:wolfgang.laun@gmail.com">wolfgang.laun@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
4.0.7 is rather old. 5.1.1 and later do not exhibit this behaviour.<br>
<br>
However, it should be noted that comparing double values using == is a<br>
precarious approach. For instance, 99.9 (the mathematical number)<br>
cannot be represented as a double machine number. Hence, you do not<br>
truly test for<br>
equality with that number, just with its approximation by some machine<br>
number.<br>
<br>
-W<br>
<div class="im"><br>
On 26/03/2012, Zeke &lt;<a href="mailto:xanadu860122@gmail.com">xanadu860122@gmail.com</a>&gt; wrote:<br>
&gt; Hi, guys:<br>
&gt;   I am using Drools 4.0.7. I find a strange behavior. When my LHS is<br>
&gt; &quot;Message( varDouble == 99.9 )&quot; and &quot;varDouble&quot; equals &quot;new Double(99.9)&quot;,<br>
&gt; the condition is true. But when my LHS is &quot;Message( types.doubleType ==<br>
&gt; 99.9 )&quot; and the &quot;doubleType&quot; field is also equal to &quot;new Double(99.9)&quot;, the<br>
&gt; condition is false. I debug the code, and find that:<br>
&gt;<br>
&gt;   When the LHS is &quot;Message( varDouble == 99.9 )&quot;, the logic will handle the<br>
</div>&gt; literal 99.9 as *Double.valueOf( “99.9” )*, and the comparison is between<br>
&gt; *(new<br>
&gt; Double(99.9)).doubleValue(*) and *Double.valueOf( “99.9” ).doubleValue()*,<br>
<div class="im">&gt;   When the LHS is &quot;Message( types.doubleType == 99.9 )&quot;, the logic is<br>
</div>&gt; different from above. The comparison is between *new BigDecimal((Double)<br>
&gt; 99.9, MathContext.DECIMAL64)* (which double value is 99.90000000000001) and<br>
&gt; *new BigDecimal(“99.9”, MathContext.DECIMAL64)* (which double value is<br>
<div class="im">&gt; 99.9).<br>
&gt;<br>
&gt;   I think we need make things consistent. &quot;varDouble&quot; and<br>
&gt; &quot;types.doubleType&quot; are of the same type and value. It doesn&#39;t make sense to<br>
&gt; have different behavior just because of one field is nesting while the<br>
&gt; other is not.  I know Drools is using MVEL to evaluate the condition. But I<br>
&gt; am not sure it is a MVEL bug or Drools uses MVEL wrong. It will be much<br>
&gt; appreciated if you can give me any comments!<br>
&gt;<br>
<br>
</div>_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
</blockquote></div><br>