public class TestBigDecimal {
public static void main(String[] args){
BigDecimal b1=new BigDecimal(0.22);
BigDecimal b2=new BigDecimal("0.22");
System.out.println("b1的值:"+b1);
System.out.println("b2的值:"+b2);
}
}
结果 :
b1的值:
0.2200000000000000011102230246251565404236316680908203125
b2的值:0.22
原因:
构造方法参数为double类型有一定的不可预知性,表面上看是0.22,实际上是0.2200000000000000011102230246251565404236316680908203125,0.22在java中无法准确的表示为double
解决方案:
1.采用String 类型的构造参数。
2.如果必须要使用double,则可使用Double.toString(double) 方法转换成String, 再采用Bigdecimal的构造函数.
public static void t1(){
BigDecimal b1=new BigDecimal("10");
BigDecimal b2=new BigDecimal("3");
System.out.println(b1.divide(b2).setScale(2,BigDecimal.ROUND_HALF_UP));
}
结果:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result
原因:
当遇到除不尽的情况时,会报以上错误
解决方案:
System.out.println(b1.divide(b2,2,BigDecimal.ROUND_HALF_UP));
public static void t2(){
BigDecimal b1=new BigDecimal("0.0");
BigDecimal b2=BigDecimal.ZERO;
System.out.println(b1.equals(b2));
}
结果:
false
原因:
BigDecimal 的equals 方法不仅仅是比较值,还会比较scale的位数是否相等,而Bigdecimal.ZERO的scale是0,所以为 false
解决方案:
使用compareTo方法. System.out.println(b1.compareTo(b2)==0)
全部0条评论
快来发表一下你的评论吧 !