2016-06-28 178 views
2

我想要应用格式(后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)。

+1

是变量'a' float还是double? – sidgate

+0

其双双a = 1231254125412512.231515235346; – malviyarahuljayendra

+0

由于Double具有53位的精度。所以它的最大值是17位数。 1231254125412512.231515235346〜1231254125412512.2(17位数字) – ThiepLV

回答

1

问题是您使用double变量,并且命中最大精度 Double.MIN_VALUE

SOURCE:

双:其中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 
+1

您的解决方案是正确的,但您的第一个陈述不是。 1231254125412512.231515235346 Double.MIN_VALUE。问题在于double没有精确度来保存一个非常大的数字,并且精度非常高,所以它会被舍入。 –

+0

@ErwinBolwidt纠正并链接了一个源文件。非常感谢! –

+1

感谢您的帮助!理解了这个概念 – malviyarahuljayendra

2

双人有53位,它是约16位的精度。