Thanks for your reply, Wolfgang! But I don't think this makes sense. Yes, I know rational numbers has precision. We can not use "==" in Java program to decide equality. But I think when we use Drools, Drools should handle the precision and make "==" works. We may use Drools in our Business product. For example, say, user may set a rule like "SomeProduct.price == 99.9" which is a common use case, right? The user may not know computer very well. He will wonder why this rule wil not satisfy. I think Drools can do thing in this way, given a precision scope. For example, if the price > 99.989999999 and price < 99.900000001 then let price == 99.9 true.
Thanks - Zeke 2009/4/21 Wolfgang Laun <[email protected]> > The long answer to your question can be found in > http://en.wikipedia.org/wiki/Floating_point. > > The short answer is that machine numbers for floats and doubles are > approximations to almost all rational numbers, or, if you prefer, fractions. > This is because most numbers have infinite binary expansions (such as 1/3 in > decimal). > > Even when you use "99.9" in one place (a Java program), there's no > guarantee that the double produced by the Java compiler is equal to the > double resulting from the same literal via Drools' compiler chain (in a DRL > file). Conversion between double and float is guaranteed to generate > inequality for such numbers. > > For your tests you might try a fraction that can be represented accurately, > e.g., 0.5 or 0.125. > > -W > > > 2009/4/21 Zeke <[email protected]> > >> Hi, All: >> My drl file is like below: >> package org.drools.examples; >> >> import org.drools.examples.HelloWorldExample.Message; >> >> rule "check deep int" >> dialect "java" >> when >> m:Message( sec.fir.d == "99.9" ) >> then >> System.out.println( "===check deep double ok===" ); >> end >> >> I find that "==" operator does not work well on double and float type. >> This condition can not be satisfied. If I change the condition to sec.fir.d >> < "100" or sec.fir.d > "99.8", it works well. Is it a bug? >> >> I attach my test code. And I add below jars into classpath: >> antlr-runtime-3.0.jar >> core-3.2.3.v_686_R32x.jar >> drools-compiler-4.0.7.jar >> drools-core-4.0.7.jar >> drools-decisiontables-4.0.7.jar >> drools-jsr94-4.0.7.jar >> janino-2.5.10.jar >> jsr94-1.1.jar >> mvel-1.3.12-java1.5.0.jar >> >> Can anyone kindly help me? >> >> Thanks! >> - Zeke >> >> _______________________________________________ >> rules-users mailing list >> [email protected] >> https://lists.jboss.org/mailman/listinfo/rules-users >> >> > > _______________________________________________ > rules-users mailing list > [email protected] > https://lists.jboss.org/mailman/listinfo/rules-users > >
_______________________________________________ rules-users mailing list [email protected] https://lists.jboss.org/mailman/listinfo/rules-users
