1 /**
2 * 浮点数表示问题
3 * @author husky
4 */
5 public class Change {
6 public static void main(String[] args) {
7 double num1 = 2.00;
8 double num2 = 1.10;
9 double num3 = 1.90;
10 // 结果:0.8999999999999999
11 System.out.println(num1 - num2);
12 // 0.10000000000000009
13 System.out.println(num1 - num3);
14 // 1.0
15 System.out.println((num1 - num2) + (num1 - num3));
16
17 System.out.printf("jdk5 printf : %.2f%n",num1 - num2);
18 //use BigDecimal(String): 0.90
19 //use BigDecimal(Double): 0.899999999999999911182158029987476766109466552734375
20 System.out.println("use BigDecimal(String): " + new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
21 System.out.println("use BigDecimal(Double): " + new BigDecimal(2.00).subtract(new BigDecimal(1.10)));
22 }
23 /**
24 * 解析:
25 * java浮点数表示对于一些小数并不能精确的表示,只能表示成它的临界值;
26 * 但是这只是个别的,详细请参考别处
27 */
28
29 /**
30 * 解决:
31 * 获取在使用jdk 5.0之后,通过printf得到的是正确的结果,但是底层的问题依然存在
32 * 因此对于涉及需要非常精确的结果,使用浮点数并不合适,尤其是货币运算
33 *
34 * 方案1:
35 * 将运算进行扩大,使用int,long 进行运算,将2美元表示成200美分进行运算
36 *
37 * 方案2:
38 * 使用BigDecimal,但要注意使用BigDecimal(String)构造器,不要使用BigDecimal(Double)
39 * 后者与上面的情况类似的
40 */
41 }