Puzzle 02: Time for a Change

Java浮点数的问题

首先看下面的代码:

System.out.println(2.00 - 1.10);

打印出来的结果应该是0.90吗?否!结果为:0.8999999999999999。

原因是Java无法精确表达浮点数所致。在 Java 中,浮点数的值采用二进制系统表示,它无法精确表示十进制的分数 1/10,正如十进制中无法用有限位小数表示 1/3 一样。但 Java 也提供了一种解决之道:

new BigDecimal("2.00").subtract(new BigDecimal("1.10"));

二进制浮点运算对金融计算来说是不适合的。当需要精确计算时候,要避免使用float, double而考虑使用int, long, 或者 BigDecimal。

TODO: 具体参照IEEE 754。

  1. Wikipedia: IEEE 754(中文词条),