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

时间:2023-03-09 00:47:02
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); 搞定