- java没办法用二进制精确的表示浮点数
double d = 0.1;
//这可以看出变量d的真实值
System.out.println(new BigDecimal(0.1).toString());//结果:0.1000000000000000055511151231257827021181583404541015625
//这里是0.1,是因为被格式化输出了,这种格式化的结果有时也是不对的
System.out.println(d);//结果是0.1
- 直接使用浮点数的计算结果同样没法精确表示
double d = 0.1;
double f = 0.3;
//虽然格式化了,但是结果也不对
System.out.println(0.3 / 0.1);//结果:2.9999999999999996
//计算的结果仍是错误的
System.out.println(new BigDecimal(0.3 / 0.1).toString());//结果:2.999999999999999555910790149937383830547332763671875
- 用
BigDecimal.valueOf(0.3)
或者new BigDecimal(Double.toString(0.3))
构造BigDecimal对象才能进行精确计算
double d = 0.1;
double f = 0.3;
//精确计算
System.out.println(BigDecimal.valueOf(f).divide(BigDecimal.valueOf(d)));//结果是3
System.out.println(new BigDecimal(Double.toString(f)).divide(new BigDecimal(Double.toString(d))));//结果为3
结论:
- 浮点数如果不进行运算,只进行传递和存储可以用double类型表示,虽然是不精确的,但不会有太大影响,如果进行运算或比较必须用BigDecimal处理。
- BigDecimal的运算结果是精确的,小数位数量是确定的,不会出现无限小数位的情况(除非本身就是1/3这种除不尽情况),可以认为就是现实中的浮点数运算。
- BigDecimal的运算可以用BigDecimal.doubleValue()表示,结果同1