JAVA 在创建BigDecimal()时存在失真的情况:

        1、参数类型为double的构造方法的结果有一定的不可预知性。newBigDecimal(0.1) 所创建的BigDecimal不等于0.1,它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double,所以传入到构造方法的值不会正好等于 0.1。

通常建议优先使用String构造方法。
 

package com.smtp;
import java.math.BigDecimal;
public class mytest {
public static void main(String[] args) {
Double a=0.3;
System.out.println(new BigDecimal(a-0.1)); //失真
System.out.println(a-Double.valueOf(String.valueOf(0.1)));//失真
System.out.println(new BigDecimal(Double.toString(a)).subtract(new BigDecimal(String.valueOf(0.1))));//不失真
System.out.println(new BigDecimal(Double.toString(a)).subtract(new BigDecimal(Double.toString(0.1))));//不失真
}
}