java BigDecimal精度问题
float类型构造参数
float money = 0.1f;
BigDecimal floatBig = new BigDecimal(money);
System.out.println(floatBig.toString());
执行结果:0.100000001490116119384765625
double类型构造参数
double moneyDouble = 0.1d;
BigDecimal moneyDoubleBig = new BigDecimal(moneyDouble);
System.out.println(moneyDoubleBig.toString());
执行结果:0.1000000000000000055511151231257827021181583404541015625
string类型构造参数
String moneyString = "0.1";
BigDecimal bigDecimalString = new BigDecimal(moneyString);
System.out.println(bigDecimalString.toString());
执行结果:0.1
从上面结果可以看出使用不同构造函数产生的结果是不同的,对于系统精度要求较高的计算(如涉及金钱)基本都使用Bigdecimal类进行基本运算,但是这里有个小坑,如果没有进行验证或没有研究就使用会碰到精度的问题。
查看Bigdecimal源码:
-
以double为构造参数;
The results of this constructor can be somewhat unpredictable这句提示这个构造函数的结果可能有些不可预测,并且下面也举例了以0.1为参数创建的结果实际为0.1000000000000000055511151231257827021181583404541015625
所以在使用Bigdecimal的时候请使用String为构造参数创建对象。