代码:

double d = -123456789012345.3426;//5898895455898954895989;
 
NumberFormat nf = new DecimalFormat("#0.###");
nf.setMinimumFractionDigits(3);// 小数点后不足的补零:小数点之后最多3位数字
String amt = nf.format(d);// 将double类型的数格式化并转换成字符串,实际上进行了四舍五入
 
System.out.println("a:" + amt);
 
BigDecimal bd = new BigDecimal(String.valueOf(d));
bd = bd.setScale(3, BigDecimal.ROUND_HALF_UP);
String amtb = bd.toString();
 
System.out.println("b:" + amtb); 运行效果:a:-123456789012345.340
b:-123456789012345.340
这显然不是我想要的,我要的结果为:-123456789012345.343

解决方案 »

  1.   

    double 的有效数字是16位
      

  2.   

    这是java内部机制问题,小数点后只能保留16位小数,多余的就自动去掉了。
    double d = -123456789012345.3426;//5898895455898954895989;
    System.out.println("d:" + d);
    输出结果就知道了。先转化为科学计数法:-1.2345678901234534E14自动舍掉了26所以格式化的时候自然就是.340了
    double d = -3456789012345.3426;设成这样的时候就是正确的了
      

  3.   

    建议转成string 在用new BigDecimal(str) 这种做法精确度比较高