Musings about this and that

October 27, 2009

When equals() is not equal enough

Filed under: miscellaneous — ajesse @ 1:36 pm
Tags: ,

The other day we were struggling doing comparisions with BigDecimals in a distributed application with BigDecimals originating from different sources. As we had learned we used equals() to compare the objects and even though everything seemed correct, even in the debugger, the logic that indicated an equality condition never was executed.

Check these two methods, and try to predict the outcome:

  private void sample1() {
    BigDecimal one1 = new BigDecimal("1");
    BigDecimal one2 = new BigDecimal("1.000");

    System.out.println("Comparing new BigDecimal(\"1\") and BigDecimal(\"1.000\"):");
    if (one1.equals(one2)) {
      System.out.println("  equals() indicates equality...");
    } else {
      System.out.println("  equals() indicates different values...");
      if (one1.compareTo(one2) == 0) {
        System.out.println("    but comparesTo() thinks the two BigDecimals are equal.");
      } else {
        System.out.println("    and comparesTo() thinks the same.");
      }
    }
  }

  private void sample2() {
    BigDecimal one1 = new BigDecimal(1);
    BigDecimal one2 = one1.setScale(3);

    System.out.println("Comparing new BigDecimal(1) and BigDecimal(1).setScale(3):");
    if (one1.equals(one2)) {
      System.out.println("  equals() indicates equality...");
    } else {
      System.out.println("  equals() indicates different values...");
      if (one1.compareTo(one2) == 0) {
        System.out.println("    but comparesTo() thinks the two BigDecimals are equal.");
      } else {
        System.out.println("    and comparesTo() thinks the same.");
      }
    }
  }

Looking into the Javadoc (Java 5) of BigDecimals gave a first hints:

Note: care should be exercised if BigDecimal objects are used as keys in a SortedMap or elements in a SortedSet since BigDecimal’s natural ordering is inconsistent with equals. See Comparable, SortedMap or SortedSet for more information.

and

Compares this BigDecimal with the specified Object for equality. Unlike compareTo, this method considers two BigDecimal objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by this method).

That definitely was a bit unexpected, but at least documented.

October 5, 2007

A trip back to nature

Filed under: miscellaneous, outdoor, travel — ajesse @ 7:00 pm

The other we went for a little walk to a place that seems almost isolated from civilization, which is a difficult thing here in Switzerland. But once you have left behind the car and walked for 10 minutes in the moor landscape of Glaubenberg, you have to impression to be out there in the wilderness. check out the photographs I took. Every now and then you find traces of civilization like a nice restaurant or a alpine dairy, where they herd the cattle during summer and produce some of the best cheese of the world. OR those nice informative small projects… like this quiz/game, where you have a few questions that deal with the local and non-local flora. Or signposts like this one that shows you the names of the flowers you can find along the way.

Obviously the food you can eat at the Schwendi-Kaltbad restaurant is just great and after a little hike you can relish it even more. Sitting close to one of the three open fire cooking places in the log-cabin style restaurant, sipping some drink and waiting for the fine food is just a decent finish of a great day…

Gotta go there more often.

July 4, 2007

Starting

Filed under: miscellaneous — ajesse @ 10:52 pm

Signing up is easy, setting up requires some work, blogging will take time to get used to.

Yours sincerely

Alexander Jesse

Blog at WordPress.com.