浮点数精确表示
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 }