It'd be great if this got fixed - we met an ugly bug yesterday due to this on our project.
(Our system validates that the sum of two monetary fields A and B equals the sum of two monetary fields C and D. We parse the fields via Cheshire with conversion to bigdecimal turned on - but any fields with no fractional part get parsed as Integers anyway. So if A=$1.50, B=$1.50, C=$2 and D=$1, (== (+ A B) (+ C D)) is false... ) - Korny On 2 August 2013 15:25, CGAT <genovese...@gmail.com> wrote: > Terrific, Andy, thanks. I will definitely take a look. > > > On Friday, August 2, 2013 1:16:14 AM UTC-4, Andy Fingerhut wrote: > >> I agree, which is why I wrote a patch for the ticket >> http://dev.clojure.org/jira/**browse/CLJ-1118<http://dev.clojure.org/jira/browse/CLJ-1118> >> >> (Depending on when you read this, dev.clojure.org may not be accessible >> due to a recent DNS update made by the Clojure folks. Wait a while and try >> again.) >> >> It makes not only the change you suggest, but also another one to how >> hash is calculated for BigDecimal values, so that hash is still consistent >> with =. Take a look at it and see if you think it is correct. >> >> Andy >> >> >> On Thu, Aug 1, 2013 at 9:28 PM, CGAT <genov...@gmail.com> wrote: >> >>> My understanding of == is that it is intended to establish numerical >>> equivalence >>> across types. But I think that basic contract fails with BigDecimal. >>> For instance, >>> >>> (== 1M 1.0M) ; => false >>> >>> because the scale properties of these numbers are different. So then >>> of course: >>> >>> [(== 1 1N 1.0) (== 1 1N 1.0 1M) (== 1 1N 1.0 1.0M) (== 1 1.0 1N 1.0M)] >>> ; => [true true true false] >>> and >>> [(== 1.0M 1.0) (== 1.0 1) (== 1 1N) (== 1N 1.0M)] >>> ; => [true true true false] >>> >>> I find your lack of transitivity (and commutativity) ... disturbing. >>> >>> The issue is that there are two notions of equality for BigDecimal, >>> equals and compareTo, where equals compares value *and* scale while >>> compareTo compares numerically. >>> >>> The other numeric types use equals for equivalence, quite reasonably. >>> But in class BigDecimalOps in clojure/lang/Numbers.java, I propose >>> that >>> >>> public boolean equiv(Number x, Number y){ >>> return toBigDecimal(x).equals(**toBigDecimal(y)); >>> } >>> >>> should be >>> >>> public boolean equiv(Number x, Number y){ >>> return toBigDecimal(x).compareTo(**toBigDecimal(y)) == 0; >>> } >>> >>> to give the proper sense of equivalence. >>> >>> I haven't had a chance yet to recompile with this change to test it, >>> but we do have >>> >>> (zero? (. 1.0M (compareTo 1M))) ; => true >>> (zero? (. 1.0000M (compareTo 1M))) ; => true >>> (zero? (. 1.000M (compareTo 1.0M))) ; => true >>> >>> as desired. >>> >>> Reactions? >>> >>> Best, >>> >>> Chris >>> >>> -- >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to clo...@googlegroups.com >>> >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> To unsubscribe from this group, send email to >>> clojure+u...@**googlegroups.com >>> >>> For more options, visit this group at >>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to clojure+u...@**googlegroups.com. >>> >>> For more options, visit >>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out> >>> . >>> >>> >>> >> >> -- > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- Kornelis Sietsma korny at my surname dot com http://korny.info .fnord { display: none !important; } -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.