Java中BigDecimal使用注意事项

public static void main(String[] args) {
        System.out.println("a="+new BigDecimal(1.3));
        System.out.println("b="+new BigDecimal("1.3"));

    }

输出:

a=1.3000000000000000444089209850062616169452667236328125
b=1.3
  1. 参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
  2. 另一方面,String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言, 通常建议优先使用String构造方法。 
  3. 当double必须用作BigDecimal的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法,将double转换为String。要获取该结果,请使用static valueOf(double)方法。 

BigDecimal比较

 public static void main(String[]  args){  
        BigDecimal a = newBigDecimal("1");  
        BigDecimal b = newBigDecimal("2");  
        BigDecimal c = newBigDecimal("1");  
        int result1 = a.compareTo(b);  
        int result2 = a.compareTo(c);  
        int result3 = b.compareTo(a);  
        System.out.println(result1);  
        System.out.println(result2);  
        System.out.println(result3);  
          
    }  
-1,0,1

即左边比右边数大,返回1,相等返回0,比右边小返回-1。注意 不可用equals进行相等的判断,equals 比较是两个BigDecimal对象的地址。 

BigDecimal总结

 

  1. 在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。
  2. 尽量使用参数类型为String的构造函数。
  3.  BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。

BigDecimal除法注意

  public static void main(String[] args) {
        BigDecimal bigDecimal = new BigDecimal("50");
        BigDecimal bigDecimal2 = new BigDecimal("3");
        BigDecimal divide = bigDecimal.divide(bigDecimal2);
    }

结果为16.66666666666666666666......无限循环小数

当运算结果为无限循环小数时会抛出异常

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
	at java.math.BigDecimal.divide(BigDecimal.java:1690)
	at Common.main(Common.java:8)

所以这边我们需要设置精确度

public static void main(String[] args) {
        BigDecimal bigDecimal = new BigDecimal("50");
        BigDecimal bigDecimal2 = new BigDecimal("3");
        BigDecimal divide = bigDecimal.divide(bigDecimal2,2,BigDecimal.ROUND_HALF_EVEN); //保留两位小数
        System.out.println(divide);
    }

结果为

16.67

 

你可能感兴趣的:(Java小知识,Java,BigDecimal)