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
- 参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
- 另一方面,String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言, 通常建议优先使用String构造方法。
- 当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总结
- 在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。
- 尽量使用参数类型为String的构造函数。
- 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