在项目中遇到一个问题用double类型的数字(小数点后只有两位)相加或者相减得出的结果并不是预期的结果,乘除也一样。
double d1 = 1.11;
double d2 = 11.02;
打印结果为:12.129999999999999
原因:二进制不能精确的表示小数,就像10进制不能精确表示1/3
解决方案:
-
采用整数,即先乘以100在除回去(在不确定是多少位小数点时使用不方便)
-
如果精度要求不是特别高可以直接用double运算在格式化
//保留两位小数
String.format("%.2f", double);
DecimalFormat df = new DecimalFormat("#.00")
df.format(double)
3.采用BigDecimal运算 (去掉小数点后末尾的0,科学计数法转数字)
Double d = 0.3;
BigDecimal b = new BigDecimal("0.3");
// 使用构造器时最好使用String的构造器
BigDecimal bd = new BigDecimal(d.toString());
b.add(bd);
b.subtract(bd);
b.multiply(bd);
BigDecimal result = b.divide(bd);
//去掉BigDecimal末尾多余的0并toString
//如果直接toString有可能是科学计数,需要 toPlainString()。
result.stripTrailingZeros().toPlainString()