java中四舍五入——double转BigDecimal的精度损失问题

代码:

		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

 原因:double 有效的数据 15或 16位

直接用  new BigDecimal(String); 搞定

原文地址:https://www.cnblogs.com/interdrp/p/9017734.html