BigDecimal代替浮点数
1 介绍
BigDecimal提供了多个构造函数,和浮点数有关的有:
- BigDecimal(double val) Translates a double into a BigDecimal.
- BigDecimal(String val) Translates the String representation of a BigDecimal into a BigDecimal.
用double参数来创建对象得到不精确的值,只有通过String来创建对象才是最准确的。
2 例子
BigDecimal data1=new BigDecimal(0.05);
System.out.println(data1.toString());
得到结果:0.05000000000000000277555756156289135105907917022705078125
BigDecimal data2=new BigDecimal("0.05");
System.out.println(data2.toString());
得到结果:0.05
3 浮点数精度问题
- 问题原因:浮点数在内存中是近似存储
- 避免问题的办法:
方法1:不用浮点数,用整数代替,例如进行资金运算时,按单位为分的整数进行运算;
方法2:使用BigDecimal代替浮点数
4 BigDecimal.valueOf(double val)创建对象
public static BigDecimal valueOf(double val)
{
return new BigDecimal(Double.toString(val));
}
总结:BigDecimal的加减乘除其实最终都返回的是一个新的BigDecimal对象
5 例子