public class TestClass { public static void equality () { double dd = 3.5; float ff = 3.5f; System.out.println(String.format("dd vs ff == %b", dd==ff)); double dd2 = 3.2; float ff2 = 3.2f; System.out.println(String.format("dd2 vs ff2 == %b", dd2==ff2)); } }
REPL output: => (idem.core.TestClass/equality) nil Console output: nREPL server started on port 38698 on host 127.0.0.1 - nrepl://127.0.0.1:38698 dd vs ff == true dd2 vs ff2 == false We are talking about values as primitive types, not boxed values as objects: The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true). => (class (float 3.2)) java.lang.Float => (class (double 3.2)) java.lang.Double Oupse... :) Luc P. On Fri, 23 Jan 2015 01:31:31 -0800 Mark Engelberg <mark.engelb...@gmail.com> wrote: > On Fri, Jan 23, 2015 at 1:10 AM, Luc Prefontaine < > lprefonta...@softaddicts.ca> wrote: > > > Agree, it's broken... in java... > > > > I think it's more frustrating in Clojure than in Java, though, > because in Java you have those big, ugly type annotations on every > single variable, input and output, so there's really no question when > you're working with a mixture of floats and doubles. In Clojure, > it's much easier for this kind of thing to slip into your program > unnoticed. Call a couple of external libraries that produce floats > or doubles -- Clojure will happily hide the difference from you and > then you get burned. > > As I frequently find myself explaining to newcomers to Clojure, one of > Clojure's biggest weaknesses is that it goes to great pains to hide > type details (floats vs doubles, boxed vs unboxed, hash sets vs array > sets, etc.) and every once in a while it really matters -- a lot -- > what the types actually are and there aren't many tools for > discovering the flow of types through your code. > > So I wouldn't necessarily go blaming this on Java. > > Furthermore, I'm not so sure it is broken in Java: > > => (.equals (float 2) (double 2)) > false > > => (.compareTo (float 2) (double 2)) > ClassCastException Cannot cast java.lang.Double to java.lang.Float > java.lang.Class.cast (Class.java:3258) > > So Java doesn't appear to transparently treat floats and doubles as > equal (which is consistent with the fact that Java's hashes of floats > and doubles can be different). > -- Luc Préfontaine SoftAddicts inc. Québec, Canada Mobil: (514) 993-0320 Fax: (514) 800-2017 -- 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/d/optout.