我正在尝试应用格式化(经过3位数字和四位数后的舍入),使用下面的代码 -
double a = 1231254125412512.231515235346;
NumberFormat formatter = new DecimalFormat("#,###");
formatter.setRoundingMode(RoundingMode.HALF_UP);
formatter.setMinimumFractionDigits(4);
formatter.setMaximumFractionDigits(4);
System.out.println("Number : " + formatter.format(a));
以上代码适用于号码-54125412512.231515235346
(结果为-54,125,412,512.2315
)。
但它不适用于数字-1231254125412512.231515235346
(结果-1,231,254,125,412,512.2000
)。
答案 0 :(得分:2)
Double的精度为53位,约为16位。
答案 1 :(得分:1)
问题是你使用double
变量,然后点击最大精度 。Double.MIN_VALUE
double:64位(8字节)其中 52位用于尾数(15到17位小数,平均大约16位)。 11位用于指数,1位用于符号位。
要避免此问题,请改用BigDecimal
:
BigDecimal a = new BigDecimal("-54125412512.231515235346");
BigDecimal b = new BigDecimal("-1231254125412512.231515235346");
NumberFormat formatter = new DecimalFormat("#,###");
formatter.setRoundingMode(RoundingMode.HALF_UP);
formatter.setMinimumFractionDigits(4);
formatter.setMaximumFractionDigits(4);
System.out.println("Number : " + formatter.format(a));
System.out.println("Number : " + formatter.format(b));
输出:
Number : -54.125.412.512,2315
Number : -1.231.254.125.412.512,2315