DecimalFormat的工作不正常
我想要应用格式(后3位和后4位四舍五入),使用下面的代码 -DecimalFormat的工作不正常
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
)。
问题是您使用double
变量,并且命中最大精度
。Double.MIN_VALUE
双:其中52比特用于尾数(15到17个十进制数字,平均约16)64位(8个字节)。 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));
OUTPUT:
Number : -54.125.412.512,2315
Number : -1.231.254.125.412.512,2315
您的解决方案是正确的,但您的第一个陈述不是。 1231254125412512.231515235346
@ErwinBolwidt纠正并链接了一个源文件。非常感谢! –
感谢您的帮助!理解了这个概念 – malviyarahuljayendra
双人有53位,它是约16位的精度。
是变量'a' float还是double? – sidgate
其双双a = 1231254125412512.231515235346; – malviyarahuljayendra
由于Double具有53位的精度。所以它的最大值是17位数。 1231254125412512.231515235346〜1231254125412512.2(17位数字) – ThiepLV